Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Unified Diff: src/ports/SkAshmemImageCache.cpp

Issue 12398021: If Ashmem cache fails pinCache, do not reallocate. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Rebase Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/lazy/SkLruImageCache.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ports/SkAshmemImageCache.cpp
diff --git a/src/ports/SkAshmemImageCache.cpp b/src/ports/SkAshmemImageCache.cpp
index a85542271df733e5c2a421f62e4ef9c69a38008e..b7c6c7058b7d23f96c87b5bed293a6f985a8f4ca 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);
« no previous file with comments | « src/lazy/SkLruImageCache.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698