Annotation of embedaddon/bird2/lib/idm.c, revision 1.1
1.1 ! misho 1: /*
! 2: * BIRD Library -- ID Map
! 3: *
! 4: * (c) 2013--2015 Ondrej Zajicek <santiago@crfreenet.org>
! 5: * (c) 2013--2015 CZ.NIC z.s.p.o.
! 6: *
! 7: * Can be freely distributed and used under the terms of the GNU GPL.
! 8: */
! 9:
! 10: #include <stdlib.h>
! 11:
! 12: #include "nest/bird.h"
! 13: #include "lib/idm.h"
! 14: #include "lib/resource.h"
! 15: #include "lib/string.h"
! 16:
! 17:
! 18: void
! 19: idm_init(struct idm *m, pool *p, uint size)
! 20: {
! 21: m->pos = 0;
! 22: m->used = 1;
! 23: m->size = size;
! 24: m->data = mb_allocz(p, m->size * sizeof(u32));
! 25:
! 26: /* ID 0 is reserved */
! 27: m->data[0] = 1;
! 28: }
! 29:
! 30: static inline int u32_cto(uint x) { return ffs(~x) - 1; }
! 31:
! 32: u32
! 33: idm_alloc(struct idm *m)
! 34: {
! 35: uint i, j;
! 36:
! 37: for (i = m->pos; i < m->size; i++)
! 38: if (m->data[i] != 0xffffffff)
! 39: goto found;
! 40:
! 41: /* If we are at least 7/8 full, expand */
! 42: if (m->used > (m->size * 28))
! 43: {
! 44: m->size *= 2;
! 45: m->data = mb_realloc(m->data, m->size * sizeof(u32));
! 46: memset(m->data + i, 0, (m->size - i) * sizeof(u32));
! 47: goto found;
! 48: }
! 49:
! 50: for (i = 0; i < m->pos; i++)
! 51: if (m->data[i] != 0xffffffff)
! 52: goto found;
! 53:
! 54: ASSERT(0);
! 55:
! 56: found:
! 57: ASSERT(i < 0x8000000);
! 58:
! 59: m->pos = i;
! 60: j = u32_cto(m->data[i]);
! 61:
! 62: m->data[i] |= (1 << j);
! 63: m->used++;
! 64: return 32 * i + j;
! 65: }
! 66:
! 67: void
! 68: idm_free(struct idm *m, u32 id)
! 69: {
! 70: uint i = id / 32;
! 71: uint j = id % 32;
! 72:
! 73: ASSERT((i < m->size) && (m->data[i] & (1 << j)));
! 74: m->data[i] &= ~(1 << j);
! 75: m->used--;
! 76: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>