static int inited = 0;
if (!inited) {
- idm_init(&ca_idm, &root_pool, 8);
+ idm_init(&ca_idm, &root_pool, 8, EA_CUSTOM_BIT);
HASH_INIT(ca_hash, &root_pool, CA_ORDER);
ca_storage_max = 256;
uint id = idm_alloc(&ca_idm);
- if (id >= EA_CUSTOM_BIT)
+ if (!id)
cf_error("Too many custom attributes.");
if (id >= ca_storage_max) {
void
-idm_init(struct idm *m, pool *p, uint size)
+idm_init(struct idm *m, pool *p, u64 size, u64 max)
{
m->pos = 0;
m->used = 1;
m->size = size;
+ m->max = max;
m->data = mb_allocz(p, m->size * sizeof(u32));
/* ID 0 is reserved */
static inline int u32_cto(uint x) { return ffs(~x) - 1; }
-u32
+u64
idm_alloc(struct idm *m)
{
- uint i, j;
+ u64 i, j;
for (i = m->pos; i < m->size; i++)
if (m->data[i] != 0xffffffff)
goto found;
- /* If we are at least 7/8 full, expand */
- if (m->used > (m->size * 28))
+ /* If we are at least 7/8 full, expand (if we are allowed to) */
+ if ((m->used * 32 < m->max) && (m->used > m->size * 28))
{
m->size *= 2;
m->data = mb_realloc(m->data, m->size * sizeof(u32));
if (m->data[i] != 0xffffffff)
goto found;
- ASSERT(0);
+ return 0;
found:
- ASSERT(i < 0x8000000);
-
m->pos = i;
j = u32_cto(m->data[i]);
+ u64 id = 32 * i + j;
+
+ ASSERT(id < m->max);
+
m->data[i] |= (1 << j);
m->used++;
- return 32 * i + j;
+ return id;
}
void
-idm_free(struct idm *m, u32 id)
+idm_free(struct idm *m, u64 id)
{
- uint i = id / 32;
- uint j = id % 32;
+ u64 i = id / 32;
+ u64 j = id % 32;
ASSERT((i < m->size) && (m->data[i] & (1 << j)));
m->data[i] &= ~(1 << j);
struct idm
{
u32 *data;
- u32 pos;
- u32 used;
- u32 size;
+ u64 pos;
+ u64 used;
+ u64 size;
+ u64 max;
};
-void idm_init(struct idm *m, pool *p, uint size);
-u32 idm_alloc(struct idm *m);
-void idm_free(struct idm *m, u32 id);
+void idm_init(struct idm *m, pool *p, u64 size, u64 max);
+u64 idm_alloc(struct idm *m);
+void idm_free(struct idm *m, u64 id);
#endif
ti->unit_size = TI_MIN_UNIT_SIZE;
ti->address_size = TI_MIN_ADDRESS_SIZE;
ti->index_data = mb_allocz(p, ti->unit_size * (1 << ti->address_size));
- idm_init(&(ti->idm), p, (1 << ti->address_size));
+ idm_init(&(ti->idm), p, (1 << (ti->address_size - 5)), (1 << ti->address_size));
u32 rootnode = idm_alloc(&(ti->idm));
ASSERT(rootnode == 1);
return ti;
{
rte_src_slab = sl_new(rta_pool, sizeof(struct rte_src));
- idm_init(&src_ids, rta_pool, SRC_ID_INIT_SIZE);
+ idm_init(&src_ids, rta_pool, SRC_ID_INIT_SIZE, 1ULL << 32);
HASH_INIT(src_hash, rta_pool, RSH_INIT_ORDER);
}
src->proto = p;
src->private_id = id;
src->global_id = idm_alloc(&src_ids);
+ ASSERT(src->global_id);
src->uc = 0;
HASH_INSERT2(src_hash, RSH, rta_pool, src);
init_list(&(p->area_list));
fib_init(&p->rtf, P->pool, ospf_get_af(p), sizeof(ort), OFFSETOF(ort, fn), 0, NULL);
if (ospf_is_v3(p))
- idm_init(&p->idm, P->pool, 16);
+ idm_init(&p->idm, P->pool, 16, 1ULL << 32);
p->areano = 0;
p->gr = ospf_top_new(p, P->pool);
s_init_list(&(p->lsal));
if (!nf->lsa_id)
nf->lsa_id = idm_alloc(&p->idm);
+ ASSERT(nf->lsa_id);
return nf->lsa_id;
}