Annotation of embedaddon/bird2/lib/idm.c, revision 1.1.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>