refact TDB
This commit is contained in:
parent
1bcb109800
commit
da49669a2b
|
@ -18,10 +18,10 @@ typedef TD_DLIST_NODE(SPage) SPgListNode;
|
||||||
struct SPage {
|
struct SPage {
|
||||||
pgid_t pgid; // page id
|
pgid_t pgid; // page id
|
||||||
frame_id_t frameid; // frame id
|
frame_id_t frameid; // frame id
|
||||||
|
uint8_t * pData; // real data
|
||||||
SPgListNode freeNode; // for SPgCache.freeList
|
SPgListNode freeNode; // for SPgCache.freeList
|
||||||
SPgListNode pghtNode; // for pght
|
SPgListNode pghtNode; // for pght
|
||||||
SPgListNode lruNode; // for LRU
|
SPgListNode lruNode; // for LRU
|
||||||
uint8_t * pData; // real data
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef TD_DLIST(SPage) SPgList;
|
typedef TD_DLIST(SPage) SPgList;
|
||||||
|
@ -29,7 +29,7 @@ struct SPgCache {
|
||||||
TENV * pEnv; // TENV containing this page cache
|
TENV * pEnv; // TENV containing this page cache
|
||||||
pgsz_t pgsize;
|
pgsz_t pgsize;
|
||||||
int32_t npage;
|
int32_t npage;
|
||||||
SPage * pages;
|
SPage **pages;
|
||||||
SPgList freeList;
|
SPgList freeList;
|
||||||
SPgList lru;
|
SPgList lru;
|
||||||
struct {
|
struct {
|
||||||
|
@ -44,59 +44,58 @@ static void pgCacheUnpinPage(SPage *pPage);
|
||||||
int pgCacheOpen(SPgCache **ppPgCache, TENV *pEnv) {
|
int pgCacheOpen(SPgCache **ppPgCache, TENV *pEnv) {
|
||||||
SPgCache *pPgCache;
|
SPgCache *pPgCache;
|
||||||
SPage * pPage;
|
SPage * pPage;
|
||||||
|
void * pData;
|
||||||
pgsz_t pgSize;
|
pgsz_t pgSize;
|
||||||
cachesz_t cacheSize;
|
cachesz_t cacheSize;
|
||||||
int32_t npage;
|
int32_t npage;
|
||||||
|
int32_t nbucket;
|
||||||
|
size_t msize;
|
||||||
|
|
||||||
*ppPgCache = NULL;
|
*ppPgCache = NULL;
|
||||||
pgSize = tdbEnvGetPageSize(pEnv);
|
pgSize = tdbEnvGetPageSize(pEnv);
|
||||||
cacheSize = tdbEnvGetCacheSize(pEnv);
|
cacheSize = tdbEnvGetCacheSize(pEnv);
|
||||||
npage = cacheSize / pgSize;
|
npage = cacheSize / pgSize;
|
||||||
|
nbucket = npage;
|
||||||
|
msize = sizeof(*pPgCache) + sizeof(SPage *) * npage + sizeof(SPgList) * nbucket;
|
||||||
|
|
||||||
// Allocate the handle
|
// Allocate the handle
|
||||||
pPgCache = (SPgCache *)calloc(1, sizeof(*pPgCache));
|
pPgCache = (SPgCache *)calloc(1, msize);
|
||||||
if (pPgCache == NULL) {
|
if (pPgCache == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Init the handle
|
||||||
pPgCache->pEnv = pEnv;
|
pPgCache->pEnv = pEnv;
|
||||||
pPgCache->pgsize = pgSize;
|
pPgCache->pgsize = pgSize;
|
||||||
pPgCache->npage = npage;
|
pPgCache->npage = npage;
|
||||||
|
pPgCache->pages = (SPage **)(&pPgCache[1]);
|
||||||
for (int32_t i = 0; i < npage; i++) {
|
pPgCache->pght.nbucket = nbucket;
|
||||||
/* code */
|
pPgCache->pght.buckets = (SPgList *)(&(pPgCache->pages[npage]));
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
pPgCache->pages = (SPage *)calloc(npage, sizeof(SPage));
|
|
||||||
if (pPgCache->pages == NULL) {
|
|
||||||
pgCacheClose(pPgCache);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
TD_DLIST_INIT(&(pPgCache->freeList));
|
TD_DLIST_INIT(&(pPgCache->freeList));
|
||||||
|
|
||||||
for (int32_t i = 0; i < npage; i++) {
|
for (int32_t i = 0; i < npage; i++) {
|
||||||
pPage = pPgCache->pages + i;
|
pData = malloc(pgSize + sizeof(SPage));
|
||||||
|
if (pData == NULL) {
|
||||||
|
return -1;
|
||||||
|
// TODO: handle error
|
||||||
|
}
|
||||||
|
|
||||||
|
pPage = POINTER_SHIFT(pData, pgSize);
|
||||||
|
|
||||||
pPage->pgid = TDB_IVLD_PGID;
|
pPage->pgid = TDB_IVLD_PGID;
|
||||||
pPage->frameid = i;
|
pPage->frameid = i;
|
||||||
|
pPage->pData = pData;
|
||||||
|
|
||||||
pPage->pData = (uint8_t *)calloc(1, pgSize);
|
// add current page to the page cache
|
||||||
if (pPage->pData == NULL) {
|
pPgCache->pages[i] = pPage;
|
||||||
pgCacheClose(pPgCache);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pPgCache->pght.nbucket = npage;
|
|
||||||
pPgCache->pght.buckets = (SPgList *)calloc(pPgCache->pght.nbucket, sizeof(SPgList));
|
|
||||||
if (pPgCache->pght.buckets == NULL) {
|
|
||||||
pgCacheClose(pPgCache);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
TD_DLIST_APPEND_WITH_FIELD(&(pPgCache->freeList), pPage, freeNode);
|
TD_DLIST_APPEND_WITH_FIELD(&(pPgCache->freeList), pPage, freeNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
for (int32_t i = 0; i < nbucket; i++) {
|
||||||
|
TD_DLIST_INIT(pPgCache->pght.buckets + i);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*ppPgCache = pPgCache;
|
*ppPgCache = pPgCache;
|
||||||
|
@ -106,15 +105,11 @@ int pgCacheOpen(SPgCache **ppPgCache, TENV *pEnv) {
|
||||||
int pgCacheClose(SPgCache *pPgCache) {
|
int pgCacheClose(SPgCache *pPgCache) {
|
||||||
SPage *pPage;
|
SPage *pPage;
|
||||||
if (pPgCache) {
|
if (pPgCache) {
|
||||||
tfree(pPgCache->pght.buckets);
|
for (int32_t i = 0; i < pPgCache->npage; i++) {
|
||||||
if (pPgCache->pages) {
|
pPage = pPgCache->pages[i];
|
||||||
for (int32_t i = 0; i < pPgCache->npage; i++) {
|
tfree(pPage->pData);
|
||||||
pPage = pPgCache->pages + i;
|
|
||||||
tfree(pPage->pData);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(pPgCache->pages);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pPgCache);
|
free(pPgCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue