天天看點

tokyo cabinet源代碼分析2

tokyo cabinet(以下簡稱TC)作為一個程式庫,其中并沒有main函數,那麼我們該如何去開始代碼閱讀工作,這裡的基本思路如下:

1. 首先明确TC中資料類型

2. 按照example的示例程式了解TC的運作過程。

TC中僅僅包含了8個頭檔案,各個頭檔案作用如下:

1. Md5.h 定義md5算法中需要使用的資料類型,和md5函數原型聲明

2. Myconf.h 程式配置資訊,通用頭檔案等

3. Tcadb.h 定義Abstract db類型,并聲明相關操作函數

4. Tcbdb.h 定義B+ tree database類型,并聲明相關操作函數

5. Tcfdb.h 定義fixed-length database類型,并聲明相關操作函數

6. Tchdb.h 定義Hash database類型,并聲明相關操作函數

7. Tctdb.h 定義table database類型,并聲明相關操作函數

8. Tcutil.h 定義tc中使用到的資料類型,例如TCLIST,TCXSTR等,并聲明相關類型的操作函數。

1. 字元串TCXSTR

typedef struct { char *ptr; int size; int asize; } TCXSTR;

2. List類型TCLIST

// Data type TCLIST // arr1, arr2, arr3 .................. arrN // [start ... start + num - 1 ] typedef struct { TCLISTDATUM *array; int anum; int start; int num; } TCLIST;

pointer list:

typedef struct { void **array; int anum; int start; int num; } TCPTRLIST;

3. hashmap類型TCMAP

typedef struct _TCMAPREC { int32_t ksiz; int32_t vsiz; struct _TCMAPREC *left; struct _TCMAPREC *right; struct _TCMAPREC *prev; struct _TCMAPREC *next; } TCMAPREC; typedef struct { TCMAPREC **buckets; TCMAPREC *first; TCMAPREC *last; TCMAPREC *cur; uint32_t bnum; uint64_t rnum; uint64_t msiz; } TCMAP;4.ordered tree

typedef struct _TCTREEREC { int32_t ksiz; int32_t vsiz; struct _TCTREEREC *left; struct _TCTREEREC *right; } TCTREEREC; typedef struct { TCTREEREC *root; TCTREEREC *cur; uint64_t rnum; uint64_t msiz; TCCMP cmp; void *cmpop; } TCTREE;

5.on-memory hash database

typedef struct { void **mmtxs; void *imtx; TCMAP **maps; int iter; } TCMDB;

6.on-memory tree database

typedef struct { void *mmtx; TCTREE *tree; } TCNDB;

7. 記憶體池

typedef struct { void *ptr; void (*del)(void *); } TCMPELEM; typedef struct { void *mutex; TCMPELEM *elems; int anum; int num; } TCMPOOL;

8. 分布式一緻哈希類型

typedef struct { uint32_t seq; uint32_t hash; } TCCHIDXNODE; typedef struct { TCCHIDXNODE *nodes; int nnum; } TCCHIDX;

9. database類型:abstract database

// Abstract database // TCADB = Tokyo Cabinet Abstract db typedef struct { int omode; TCMDB *mdb; TCNDB *ndb; TCHDB *hdb; TCBDB *bdb; TCFDB *fdb; TCTDB *tdb; int64_t capnum; int64_t capsiz; uint32_t capcnt; BDBCUR *cur; void *skel; } TCADB;

10.TCHDB

// TCHDB = Tokyo Cabinet Hash database typedef struct { void *mmtx; void *rmtxs; void *dmtx; void *wmtx; void *eckey; char *rpath; uint8_t type; uint8_t flags; uint64_t bnum; uint8_t apow; uint8_t fpow; uint8_t opts; char *path; int fd; uint32_t omode; uint64_t rnum; uint64_t fsiz; uint64_t frec; uint64_t dfcur; uint64_t iter; char *map; uint64_t msiz; uint64_t xmsiz; uint64_t xfsiz; uint32_t *ba32; uint64_t *ba64; uint32_t align; uint32_t runit; bool zmode; int32_t fbpmax; void *fbpool; int32_t fbpnum; int32_t fbpmis; bool async; TCXSTR *drpool; TCXSTR *drpdef; uint64_t drpoff; TCMDB *recc; uint32_t rcnum; TCCODEC enc; void *encop; TCCODEC dec; void *decop; int ecode; bool fatal; uint64_t inode; time_t mtime; uint32_t dfunit; uint32_t dfcnt; bool tran; int walfd; uint64_t walend; int dbgfd; volatile int64_t cnt_writerec; volatile int64_t cnt_reuserec; volatile int64_t cnt_moverec; volatile int64_t cnt_readrec; volatile int64_t cnt_searchfbp; volatile int64_t cnt_insertfbp; volatile int64_t cnt_splicefbp; volatile int64_t cnt_dividefbp; volatile int64_t cnt_mergefbp; volatile int64_t cnt_reducefbp; volatile int64_t cnt_appenddrp; volatile int64_t cnt_deferdrp; volatile int64_t cnt_flushdrp; volatile int64_t cnt_adjrecc; volatile int64_t cnt_defrag; volatile int64_t cnt_shiftrec; volatile int64_t cnt_trunc; } TCHDB;

11. B+ tree database

// B+ tree database // TCBDB = Tokyo Cabinet B+ database typedef struct { void *mmtx; void *cmtx; TCHDB *hdb; char *opaque; bool open; bool wmode; uint32_t lmemb; uint32_t nmemb; uint8_t opts; uint64_t root; uint64_t first; uint64_t last; uint64_t lnum; uint64_t nnum; uint64_t rnum; TCMAP *leafc; TCMAP *nodec; TCCMP cmp; void *cmpop; uint32_t lcnum; uint32_t ncnum; uint32_t lsmax; uint32_t lschk; uint64_t capnum; uint64_t *hist; int hnum; volatile uint64_t hleaf; volatile uint64_t lleaf; bool tran; char *rbopaque; volatile uint64_t clock; volatile int64_t cnt_saveleaf; volatile int64_t cnt_loadleaf; volatile int64_t cnt_killleaf; volatile int64_t cnt_adjleafc; volatile int64_t cnt_savenode; volatile int64_t cnt_loadnode; volatile int64_t cnt_adjnodec; } TCBDB;