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>