tokyo cabinet源代码分析(2)

2.2.2 TCMDB结构初始化

     在TCMDB结构中,含有TCMAP结构数组,然后各TCMAP结构在含有hash buckets数组。即:在操作过程中先在hash到TCMAP数组中的某个元素上。然后再次hash,定位到TCMAP元素的hash buckets数组元素中。不是单一的采用hash buckets数组直接进行hash映射。

    通过tcmdbnew2对于TCMDB结构进行了初始化,先分配TCMAP数组,然后对于TCMAP结构再分配hash buckets.

/*分配方法为tcmdbnew*/ /* Create an on-memory hash database with specifying the number of the buckets. */ TCMDB *tcmdbnew2(uint32_t bnum){ TCMDB *mdb; /* 默认hash桶的个数为65536*/ if(bnum < 1) bnum = TCMDBDEFBNUM; /* 对于bucket number又进行了处理,应该使得hash更为均匀*/ bnum = bnum / TCMDBMNUM + 17; TCMALLOC(mdb, sizeof(*mdb)); /*对于每个MAP分配读写锁*/ TCMALLOC(mdb->mmtxs, sizeof(pthread_rwlock_t) * TCMDBMNUM); TCMALLOC(mdb->imtx, sizeof(pthread_mutex_t)); TCMALLOC(mdb->maps, sizeof(TCMAP *) * TCMDBMNUM); if(pthread_mutex_init(mdb->imtx, NULL) != 0) tcmyfatal("mutex error"); for(int i = 0; i < TCMDBMNUM; i++){ if(pthread_rwlock_init((pthread_rwlock_t *)mdb->mmtxs + i, NULL) != 0) tcmyfatal("rwlock error"); /*对于MAP进行分配,先有MAP,然后基于MAP,分配多个bucket */ mdb->maps[i] = tcmapnew2(bnum); } mdb->iter = -1; return mdb; }

然后通过tcmapnew2对于TCMAP进行初始化。

/*分配MAP的方法*/ /* Create a map object with specifying the number of the buckets. */ TCMAP *tcmapnew2(uint32_t bnum){ if(bnum < 1) bnum = 1; TCMAP *map; TCMALLOC(map, sizeof(*map)); TCMAPREC **buckets; /*如果bnum过大,才用了mmap方式进行了映射。 *否则直接在内存中分配*/ if(bnum >= TCMAPZMMINSIZ / sizeof(*buckets)){ buckets = tczeromap(bnum * sizeof(*buckets)); } else { TCCALLOC(buckets, bnum, sizeof(*buckets)); } map->buckets = buckets; //真正使用的hash buckets桶数组 map->first = NULL; //指向头一个record记录 map->last = NULL; //指向最后一个record记录 map->cur = NULL; //通过first和last将所有的节点串联起来 map->bnum = bnum; map->rnum = 0; map->msiz = 0; return map; }

TCMAPREC结构为:

TCMAPREC存储了key和value内容。

 ----------------------------------------
|TCMAPREC结构|keybuf'/0'|valuebuf'/0'|
 -------------------------------------

其中的指针left,right为二叉树结构,prev和next将该bucket桶上的record全部

连起来,方面进行遍历。

/*数据记录结构*/ typedef struct _TCMAPREC { /* type of structure for an element of a map */ int32_t ksiz; /* size of the region of the key */ int32_t vsiz; /* size of the region of the value */ struct _TCMAPREC *left; /* pointer to the left child */ struct _TCMAPREC *right; /* pointer to the right child */ struct _TCMAPREC *prev; /* pointer to the previous element */ struct _TCMAPREC *next; /* pointer to the next element */ } TCMAPREC;

你可能感兴趣的:(struct,object,null,database,代码分析,structure)