diff options
author | scroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-04 21:38:50 +0000 |
---|---|---|
committer | scroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-04 21:38:50 +0000 |
commit | c75764ed4441a7a9ab5555824b7f5e7cc34ba368 (patch) | |
tree | 6aadb50a856ee312d577b38a8434c43830724af0 /src/ports | |
parent | a560d00ba5005ded8094a307ca41365bdf47cd50 (diff) |
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
Diffstat (limited to 'src/ports')
-rw-r--r-- | src/ports/SkAshmemImageCache.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
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<AshmemRec*>(*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<intptr_t>(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<AshmemRec*>(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); |