void hash_add(hash_table *table,uint64_t key,void *data){ hash_node *hnode = NULL; hash_node *newnode =NULL; lnodeptr pnode = NULL; linklist *l = NULL; lnodeptr node = hash_find_node(table,key); if(node != NULL){ hnode = (hash_node *) node->data; hnode->data = data; }else { newnode = hash_node_malloc(key,data); pnode = lnode_malloc(newnode); l = get_linklist(table,key); linklist_push(l,pnode); } }
static lnodeptr hash_find_node(hash_table *table,uint64_t key){ linklist *l = get_linklist(table,key); hash_node *hnode =NULL; lnodeptr node = linklist_first(l); while(node){ hnode = (hash_node *)node->data; if(hnode->key == key){ hnode->access_time = time(NULL); /* put the lastest item to the head of the link list */ (void)linklist_remove(node); linklist_push(l,node); return node; } node = linklist_get_next(l,node); } return NULL; }
static void delay_table_delete_obsolete(uint64_t key) { linklist *l = get_linklist(table,key); time_t nowtime = time(0); hash_node *hnode1=NULL; hash_node *hnode2=NULL; lnodeptr node=NULL; while(1){ node = linklist_tail(l); if(! node ){ break; } hnode1 = (hash_node *)node->data; if(hnode1->access_time+table->timeout < nowtime){ lnodeptr tail=linklist_pop_tail(l); hnode2 = (hash_node *)tail->data; if(NULL!=hnode2) { if(hnode2->data!=NULL) { linklist *msg_list=(linklist *)hnode2->data; count+=linklist_destory(msg_list); free(msg_list); hnode2->data=NULL; lDestroy++; } free(hnode2); } tail->data=NULL; free(tail); }else{ break; } } }