From e9de08c35d04175484f03f5ede386395bd3fbd04 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 2 Mar 2022 09:32:27 +0000 Subject: [PATCH] more --- source/libs/tdb/src/db/tdbPCache.c | 25 +++++++++++++++++++++++-- source/libs/tdb/src/inc/tdbPCache.h | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/source/libs/tdb/src/db/tdbPCache.c b/source/libs/tdb/src/db/tdbPCache.c index c18d43e278..fc0d2d40e8 100644 --- a/source/libs/tdb/src/db/tdbPCache.c +++ b/source/libs/tdb/src/db/tdbPCache.c @@ -45,6 +45,7 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, bool alcNe static void tdbPCachePinPage(SPage *pPage); static void tdbPCacheRemovePageFromHash(SPage *pPage); static void tdbPCacheAddPageToHash(SPage *pPage); +static void tdbPCacheUnpinPage(SPage *pPage); int tdbPCacheOpen(int pageSize, int cacheSize, int extraSize, SPCache **ppCache) { SPCache *pCache; @@ -89,8 +90,16 @@ void tdbPCacheFetchFinish(SPCache *pCache, SPage *pPage) { pPage->nRef++; // TODO: do we need atomic operation??? } -void tdbPCacheRelease(SPage *pHdr) { - // TODO +void tdbPCacheRelease(SPage *pPage) { + pPage->nRef--; + if (pPage->nRef == 0) { + if (1 /*TODO: page still clean*/) { + tdbPCacheUnpinPage(pPage); + } else { + // TODO + ASSERT(0); + } + } } static void tdbPCacheInitLock(SPCache *pCache) { pthread_mutex_init(&(pCache->mutex), NULL); } @@ -167,6 +176,18 @@ static void tdbPCachePinPage(SPage *pPage) { } } +static void tdbPCacheUnpinPage(SPage *pPage) { + // Add current page to the LRU list + SPCache *pCache; + + pPage->pLruPrev = &(pCache->lru); + pPage->pLruNext = pCache->lru.pLruNext; + pCache->lru.pLruNext->pLruPrev = pPage; + pCache->lru.pLruNext = pPage; + + pCache->nRecyclable++; +} + static void tdbPCacheRemovePageFromHash(SPage *pPage) { SPCache *pCache; SPage ** ppPage; diff --git a/source/libs/tdb/src/inc/tdbPCache.h b/source/libs/tdb/src/inc/tdbPCache.h index 92a1ffd02b..f9cf589941 100644 --- a/source/libs/tdb/src/inc/tdbPCache.h +++ b/source/libs/tdb/src/inc/tdbPCache.h @@ -44,7 +44,7 @@ int tdbPCacheOpen(int pageSize, int cacheSize, int extraSize, SPCache **ppCac int tdbPCacheClose(SPCache *pCache); SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, bool alcNewPage); void tdbPCacheFetchFinish(SPCache *pCache, SPage *pPage); -void tdbPCacheRelease(SPage *pHdr); +void tdbPCacheRelease(SPage *pPage); #ifdef __cplusplus } -- GitLab