/////////////////////////memory hash///////////////////////////// uint get_pre_mem_hash(void *argv, int klen, hashval_t *hash) { uint ret = 0; if (*hash == 0) *hash = nocase_char_hash_function(argv, klen); ret = (*hash / MULTI_HASH) % MULTI_HASH; return ret; }
//k and v both are in stack //k td //v mvalue.data int insert_kv_mem(struct rbtree *rbt,struct htable *ds,uchar *k,uchar *v,int vlen) { uchar *val = NULL; struct mvalue *mv = NULL,tmp; int ret = -1; struct rbnode *pn = NULL; struct ttlnode tn = {0}; if(vlen < 0 || vlen > MAX_RECORD_SIZE) return -1; hashval_t hash = nocase_char_hash_function(k); hash = get_pre_mem_hash(k); val = malloc(vlen); if(val == NULL) return -1; memcpy(val,v,vlen); mv = (struct mvalue*)v; ret = htable_insert(ds + hash,k,val,1,&tmp); //mem, replace if(ret == 2) free(val); if(mv->ttl == (MAX_TTL + 1))//never expired return 0; if(rbt == NULL) return 0; //data exists in htable, delete it in ttl tree, then insert pthread_mutex_lock(&rbt->lock); if(ret != 0) { tn.dlen = strlen(k) + 1; //tmp get old data tn.exp = tmp.ttl; tn.data = k; pn = find_node(rbt,&tn); //if update, we had delete tn in rbt //else update tn in rbt if(pn != NULL) delete_node(rbt,pn); } ret = insert_into_ttltree(rbt,k,mv->ttl);//ttl expired tree pthread_mutex_unlock(&rbt->lock); return 0; }