int ci_id_pool_ctor(ci_id_pool_t* idp, int max_num_ids, int init_size) { int fifo_size; ci_assert(idp); ci_assert(init_size >= 0); ci_assert(max_num_ids == -1 || init_size <= max_num_ids); if( init_size == 0 ) fifo_size = 5; else fifo_size = ci_log2_le(init_size) + 1; fifo_size = ci_pow2(fifo_size); idp->next_id = 0; idp->max_num_ids = max_num_ids; /* Want [free_ids] to be 2^x in size, as more efficient that way. */ idp->free_ids.fifo = (int*) ci_vmalloc(fifo_size * sizeof(int)); ci_fifo2_init(&idp->free_ids, fifo_size); while( init_size-- ) { ci_assert(!ci_fifo2_is_full(&idp->free_ids)); ci_fifo2_put(&idp->free_ids, (int) idp->next_id++); } return 0; }
int ci_buddy_ctor2(ci_buddy_allocator* b, unsigned order, void* (*alloc_fn)(size_t), void (*free_fn)(void*)) { unsigned o; ci_assert(b); b->order = order; b->free_lists = (ci_dllist*) alloc_fn((order+1) * sizeof(ci_dllist)); if( b->free_lists == 0 ) goto fail1; b->links = (ci_dllink*) alloc_fn(ci_pow2(order) * sizeof(ci_dllink)); if( b->links == 0 ) goto fail2; b->orders = (ci_uint8*) alloc_fn(ci_pow2(order)); if( b->orders == 0 ) goto fail3; CI_DEBUG(CI_ZERO_ARRAY(b->links, ci_pow2(order))); for( o = 0; o <= b->order; ++o ) ci_dllist_init(b->free_lists + o); ci_dllist_push(FL(b, b->order), ADDR_TO_LINK(b, 0)); ci_assert(b->order < 255); b->orders[0] = (ci_uint8)b->order; ci_assert(!IS_BUSY(b, LINK_TO_ADDR(b, ci_dllist_head(FL(b, b->order))))); return 0; fail3: free_fn(b->links); fail2: free_fn(b->free_lists); fail1: return -ENOMEM; }
void ci_netif_filter_init(ci_netif_filter_table* tbl, int size_lg2) { unsigned i; unsigned size = ci_pow2(size_lg2); ci_assert(tbl); ci_assert_gt(size_lg2, 0); ci_assert_le(size_lg2, 32); tbl->table_size_mask = size - 1; for( i = 0; i < size; ++i ) { tbl->table[i].id = EMPTY; tbl->table[i].route_count = 0; tbl->table[i].laddr = 0; } }