aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports
diff options
context:
space:
mode:
authorGravatar scroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-04 21:38:50 +0000
committerGravatar scroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-04 21:38:50 +0000
commitc75764ed4441a7a9ab5555824b7f5e7cc34ba368 (patch)
tree6aadb50a856ee312d577b38a8434c43830724af0 /src/ports
parenta560d00ba5005ded8094a307ca41365bdf47cd50 (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.cpp30
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);