summaryrefslogtreecommitdiff
path: root/src/VBox/Runtime/common/alloc/memcache.cpp
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2013-05-24 19:18:27 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2013-05-24 19:18:27 +0000
commit04600cbc399c495f32bc76770bf073c8b28d0993 (patch)
treedd49e83d8e815017b855ed9ff4756e1ac6567a0c /src/VBox/Runtime/common/alloc/memcache.cpp
parentcae299b772670032bfb7a73dada89d8c0aef910c (diff)
downloadVirtualBox-svn-04600cbc399c495f32bc76770bf073c8b28d0993.tar.gz
memcache.cpp: Optimization in the growth code. Drop strictness regarding no in-use entries on destruction.
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@46257 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/VBox/Runtime/common/alloc/memcache.cpp')
-rw-r--r--src/VBox/Runtime/common/alloc/memcache.cpp19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/VBox/Runtime/common/alloc/memcache.cpp b/src/VBox/Runtime/common/alloc/memcache.cpp
index 377652a95ed..9cce1417d04 100644
--- a/src/VBox/Runtime/common/alloc/memcache.cpp
+++ b/src/VBox/Runtime/common/alloc/memcache.cpp
@@ -122,6 +122,8 @@ typedef struct RTMEMCACHEINT
bool fUseFreeList;
/** Head of the page list. */
PRTMEMCACHEPAGE pPageHead;
+ /** Poiner to the insertion point in the page list. */
+ PRTMEMCACHEPAGE volatile *ppPageNext;
/** Constructor callback. */
PFNMEMCACHECTOR pfnCtor;
/** Destructor callback. */
@@ -209,6 +211,7 @@ RTDECL(int) RTMemCacheCreate(PRTMEMCACHE phMemCache, size_t cbObject, size_t cbA
&& !pfnCtor
&& !pfnDtor;
pThis->pPageHead = NULL;
+ pThis->ppPageNext = &pThis->pPageHead;
pThis->pfnCtor = pfnCtor;
pThis->pfnDtor = pfnDtor;
pThis->pvUser = pvUser;
@@ -244,7 +247,8 @@ RTDECL(int) RTMemCacheDestroy(RTMEMCACHE hMemCache)
return VINF_SUCCESS;
AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
AssertReturn(pThis->u32Magic == RTMEMCACHE_MAGIC, VERR_INVALID_HANDLE);
-#ifdef RT_STRICT
+
+#if 0 /*def RT_STRICT - don't require eveything to be freed. Caches are very convenient for lazy cleanup. */
uint32_t cFree = pThis->cFree;
for (PRTMEMCACHEFREEOBJ pFree = pThis->pFreeTop; pFree && cFree < pThis->cTotal + 5; pFree = pFree->pNext)
cFree++;
@@ -332,16 +336,9 @@ static int rtMemCacheGrow(RTMEMCACHEINT *pThis)
/* Make it the hint. */
ASMAtomicWritePtr(&pThis->pPageHint, pPage);
- /* Link the page. */
- PRTMEMCACHEPAGE pPrevPage = pThis->pPageHead;
- if (!pPrevPage)
- ASMAtomicWritePtr(&pThis->pPageHead, pPage);
- else
- {
- while (pPrevPage->pNext)
- pPrevPage = pPrevPage->pNext;
- ASMAtomicWritePtr(&pPrevPage->pNext, pPage);
- }
+ /* Link the page in at the end of the list. */
+ ASMAtomicWritePtr(pThis->ppPageNext, pPage);
+ pThis->ppPageNext = &pPage->pNext;
/* Add it to the page counts. */
ASMAtomicAddS32(&pThis->cFree, cObjects);