From b0ff360aa5dee6f510153032b222550a45e8a089 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 24 Feb 2022 02:39:36 +0000 Subject: [PATCH] more --- source/libs/tdb/src/db/tdbPCache.c | 87 ++++++++++++++++++++++------- source/libs/tdb/src/inc/tdbInt.h | 2 + source/libs/tdb/src/inc/tdbPCache.h | 4 +- 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/source/libs/tdb/src/db/tdbPCache.c b/source/libs/tdb/src/db/tdbPCache.c index d2b893c85a..9cb6889063 100644 --- a/source/libs/tdb/src/db/tdbPCache.c +++ b/source/libs/tdb/src/db/tdbPCache.c @@ -18,20 +18,23 @@ struct SPCache { int pageSize; int cacheSize; int extraSize; - int nRef; pthread_mutex_t mutex; - int nPage; - SPgHdr lru; - int nRecyclable; - int nHash; - SPgHdr ** pgHash; int nFree; SPgHdr * pFree; + int nPage; + int nHash; + SPgHdr ** pgHash; + int nRecyclable; + SPgHdr lru; + int nDirty; + SPgHdr * pDirty; + SPgHdr * pDirtyTail; }; #define PCACHE_PAGE_HASH(pgid) 0 // TODO #define PAGE_IS_PINNED(pPage) ((pPage)->pLruNext == NULL) +static int tdbPCacheOpenImpl(SPCache *pCache); static void tdbPCacheInitLock(SPCache *pCache); static void tdbPCacheClearLock(SPCache *pCache); static void tdbPCacheLock(SPCache *pCache); @@ -56,19 +59,9 @@ int tdbPCacheOpen(int pageSize, int cacheSize, int extraSize, SPCache **ppCache) pCache->cacheSize = cacheSize; pCache->extraSize = extraSize; - tdbPCacheInitLock(pCache); - - for (int i = 0; i < cacheSize; i++) { - pPtr = calloc(1, pageSize + extraSize + sizeof(SPgHdr)); - if (pPtr == NULL) { - return -1; - } - - pPgHdr = (SPgHdr *)&((char *)pPtr)[pageSize + extraSize]; - pPgHdr->pFreeNext = pCache->pFree; - pCache->pFree = pPgHdr; - - pCache->nFree++; + if (tdbPCacheOpenImpl(pCache) < 0) { + free(pCache); + return -1; } return 0; @@ -195,4 +188,60 @@ static void tdbPCacheAddPageToHash(SPgHdr *pPage) { pCache->pgHash[h] = pPage; pCache->nPage++; +} + +static int tdbPCacheOpenImpl(SPCache *pCache) { + SPgHdr *pPage; + u8 * pPtr; + int tsize; + + tdbPCacheInitLock(pCache); + + // Open the free list + pCache->nFree = 0; + pCache->pFree = NULL; + for (int i = 0; i < pCache->cacheSize; i++) { + tsize = pCache->pageSize + sizeof(SPgHdr) + pCache->extraSize; + pPtr = (u8 *)calloc(1, tsize); + if (pPtr == NULL) { + // TODO + return -1; + } + + pPage = (SPgHdr *)(&(pPtr[pCache->pageSize])); + pPage->pData = (void *)pPtr; + pPage->pExtra = (void *)(&(pPage[1])); + // pPage->pgid = 0; + pPage->isAnchor = 0; + pPage->isLocalPage = 1; + pPage->pCache = pCache; + pPage->pHashNext = NULL; + pPage->pLruNext = NULL; + pPage->pLruPrev = NULL; + + pPage->pFreeNext = pCache->pFree; + pCache->pFree = pPage; + pCache->nFree++; + } + + // Open the hash table + pCache->nPage = 0; + pCache->nHash = pCache->cacheSize; + pCache->pgHash = (SPgHdr **)calloc(pCache->nHash, sizeof(SPgHdr *)); + if (pCache->pgHash == NULL) { + // TODO + return -1; + } + + // Open LRU list + pCache->nRecyclable = 0; + pCache->lru.isAnchor = 1; + pCache->lru.pLruNext = &(pCache->lru); + pCache->lru.pLruPrev = &(pCache->lru); + + // Open dirty list + pCache->nDirty = 0; + pCache->pDirty = pCache->pDirtyTail = NULL; + + return 0; } \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index d4efa10595..e927cae9d6 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -70,6 +70,8 @@ static FORCE_INLINE int tdbCmprPgId(const void *p1, const void *p2) { } } +#define TDB_IS_SAME_PAGE(pPgid1, pPgid2) (tdbCmprPgId(pPgid1, pPgid2) == 0) + // framd_id_t typedef int32_t frame_id_t; diff --git a/source/libs/tdb/src/inc/tdbPCache.h b/source/libs/tdb/src/inc/tdbPCache.h index b543815799..41a7d0a26b 100644 --- a/source/libs/tdb/src/inc/tdbPCache.h +++ b/source/libs/tdb/src/inc/tdbPCache.h @@ -27,8 +27,8 @@ struct SPgHdr { void * pData; void * pExtra; SPgid pgid; - uint8_t isAnchor; - uint8_t isLocalPage; + u8 isAnchor; + u8 isLocalPage; SPCache *pCache; SPgHdr * pFreeNext; SPgHdr * pHashNext;