switchlink_db_status_t switchlink_db_mac_intf_delete( switchlink_handle_t intf_h) { tommy_node *node = tommy_list_head(&switchlink_db_mac_obj_list); while (node) { switchlink_db_mac_obj_t *obj = node->data; node = node->next; if (obj->intf_h == intf_h) { tommy_hashlin_remove_existing(&switchlink_db_mac_obj_hash, &obj->hash_node); tommy_list_remove_existing(&switchlink_db_mac_obj_list, &obj->list_node); switchlink_free(obj); } } return SWITCHLINK_DB_STATUS_SUCCESS; }
void cheap_tcam_delete(cheap_tcam_t *tcam, uint8_t *mask, uint8_t *key, cheap_tcam_node *node) { tommy_list *hashmaps = &tcam->hashmaps; tcam_hashmap_t *tcam_hashmap; tommy_node* elem = tommy_list_head(hashmaps); while(elem) { tcam_hashmap = (tcam_hashmap_t *) elem->data; if(!memcmp(mask, tcam_hashmap->mask, tcam->key_size)) { tommy_hashlin_remove_existing(&tcam_hashmap->hashmap, node); return; } elem = elem->next; } }
switchlink_db_status_t switchlink_db_mac_delete(switchlink_mac_addr_t mac_addr, switchlink_handle_t bridge_h) { switchlink_db_mac_obj_t *obj; uint32_t hash; uint8_t key[SWITCHLINK_MAC_KEY_LEN]; switchlink_db_mac_key_hash(mac_addr, bridge_h, key, &hash); obj = tommy_hashlin_search( &switchlink_db_mac_obj_hash, switchlink_db_mac_cmp, key, hash); if (!obj) { return SWITCHLINK_DB_STATUS_ITEM_NOT_FOUND; } tommy_hashlin_remove_existing(&switchlink_db_mac_obj_hash, &obj->hash_node); tommy_list_remove_existing(&switchlink_db_mac_obj_list, &obj->list_node); switchlink_free(obj); return SWITCHLINK_DB_STATUS_SUCCESS; }
void *remove_elem_hash_table(void *ht, void *ht_node) { return tommy_hashlin_remove_existing(ht, ht_node); }
void test_hashlin(void) { tommy_list list; tommy_hashlin hashlin; struct object_hash* HASH; unsigned i, n; tommy_node* p; unsigned limit; unsigned count; HASH = malloc(MAX * sizeof(struct object_hash)); for(i=0;i<MAX;++i) { HASH[i].value = i; } START("hashlin stack"); limit = 10 * sqrt(MAX); for(n=0;n<limit;++n) { tommy_list_init(&list); tommy_hashlin_init(&hashlin); /* insert */ for(i=0;i<n;++i) { tommy_list_insert_head(&list, &HASH[i].node, &HASH[i]); tommy_hashlin_insert(&hashlin, &HASH[i].hashnode, &HASH[i], HASH[i].value); } count = 0; tommy_hashlin_foreach_arg(&hashlin, count_arg, &count); if (count != n) abort(); /* remove */ p = tommy_list_head(&list); while (p) { struct object_hash* obj = p->data; p = p->next; tommy_hashlin_remove_existing(&hashlin, &obj->hashnode); } tommy_hashlin_done(&hashlin); } STOP(); START("hashlin queue"); limit = sqrt(MAX) / 8; for(n=0;n<limit;++n) { tommy_list_init(&list); tommy_hashlin_init(&hashlin); /* insert first run */ for(i=0;i<n;++i) { tommy_list_insert_head(&list, &HASH[i].node, &HASH[i]); tommy_hashlin_insert(&hashlin, &HASH[i].hashnode, &HASH[i], HASH[i].value); } count = 0; tommy_hashlin_foreach_arg(&hashlin, count_arg, &count); if (count != n) abort(); /* insert all the others */ for(;i<MAX;++i) { struct object_hash* obj; /* insert one */ tommy_list_insert_head(&list, &HASH[i].node, &HASH[i]); tommy_hashlin_insert(&hashlin, &HASH[i].hashnode, &HASH[i], HASH[i].value); /* remove one */ p = tommy_list_head(&list); obj = p->data; tommy_list_remove_existing(&list, p); tommy_hashlin_remove_existing(&hashlin, &obj->hashnode); } /* remove remaining */ p = tommy_list_head(&list); while (p) { struct object_hash* obj = p->data; p = p->next; tommy_hashlin_remove_existing(&hashlin, &obj->hashnode); } tommy_hashlin_done(&hashlin); } STOP(); }