From c75764ed4441a7a9ab5555824b7f5e7cc34ba368 Mon Sep 17 00:00:00 2001 From: "scroggo@google.com" Date: Mon, 4 Mar 2013 21:38:50 +0000 Subject: If Ashmem cache fails pinCache, do not reallocate. Review URL: https://codereview.chromium.org/12398021 git-svn-id: http://skia.googlecode.com/svn/trunk@7973 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/ports/SkAshmemImageCache.cpp | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'src/ports') diff --git a/src/ports/SkAshmemImageCache.cpp b/src/ports/SkAshmemImageCache.cpp index a85542271d..b7c6c7058b 100644 --- a/src/ports/SkAshmemImageCache.cpp +++ b/src/ports/SkAshmemImageCache.cpp @@ -41,11 +41,26 @@ static size_t roundToPageSize(size_t size) { } void* SkAshmemImageCache::allocAndPinCache(size_t bytes, intptr_t* ID) { - AshmemRec rec; - rec.fSize = roundToPageSize(bytes); + SkASSERT(ID != NULL); SkAutoMutexAcquire ac(&gAshmemMutex); + if (*ID != SkImageCache::UNINITIALIZED_ID) { + // This rec was previously allocated, but pinCache subsequently + // failed. + AshmemRec* pRec = reinterpret_cast(*ID); + SkASSERT(roundToPageSize(bytes) == pRec->fSize); + SkASSERT(pRec->fFD != -1); + (void) ashmem_pin_region(pRec->fFD, 0, 0); +#ifdef SK_DEBUG + pRec->fPinned = true; +#endif + return pRec->fAddr; + } + + AshmemRec rec; + rec.fSize = roundToPageSize(bytes); + rec.fFD = ashmem_create_region(NULL, rec.fSize); if (-1 == rec.fFD) { SkDebugf("ashmem_create_region failed\n"); @@ -70,7 +85,6 @@ void* SkAshmemImageCache::allocAndPinCache(size_t bytes, intptr_t* ID) { // In release mode, we do not keep a pointer to this object. It will be destroyed // either when pinCache returns NULL or when throwAwayCache is called. AshmemRec* pRec = SkNEW_ARGS(AshmemRec, (rec)); - SkASSERT(ID != NULL); *ID = reinterpret_cast(pRec); #ifdef SK_DEBUG this->appendRec(pRec); @@ -89,8 +103,6 @@ void* SkAshmemImageCache::pinCache(intptr_t ID) { #endif return rec->fAddr; } - // Purged. Remove the associated AshmemRec: - this->removeRec(rec); ashmem_unpin_region(fd, 0, 0); return NULL; } @@ -107,16 +119,10 @@ void SkAshmemImageCache::releaseCache(intptr_t ID) { void SkAshmemImageCache::throwAwayCache(intptr_t ID) { SkAutoMutexAcquire ac(&gAshmemMutex); AshmemRec* rec = reinterpret_cast(ID); -#ifdef SK_DEBUG - SkASSERT(!rec->fPinned); -#endif - this->removeRec(rec); -} - -void SkAshmemImageCache::removeRec(SkAshmemImageCache::AshmemRec* rec) { munmap(rec->fAddr, rec->fSize); close(rec->fFD); #ifdef SK_DEBUG + SkASSERT(!rec->fPinned); int index = this->findRec(rec); SkASSERT(index >= 0); fRecs.remove(index); -- cgit v1.2.3