summaryrefslogtreecommitdiffstats
path: root/skia/ports/SkImageRef_ashmem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'skia/ports/SkImageRef_ashmem.cpp')
-rw-r--r--skia/ports/SkImageRef_ashmem.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/skia/ports/SkImageRef_ashmem.cpp b/skia/ports/SkImageRef_ashmem.cpp
index ef5fc58..1bb65c4 100644
--- a/skia/ports/SkImageRef_ashmem.cpp
+++ b/skia/ports/SkImageRef_ashmem.cpp
@@ -37,7 +37,10 @@ SkImageRef_ashmem::SkImageRef_ashmem(SkStream* stream,
SkImageRef_ashmem::~SkImageRef_ashmem() {
fCT->safeUnref();
+ this->closeFD();
+}
+void SkImageRef_ashmem::closeFD() {
if (-1 != fRec.fFD) {
#ifdef DUMP_ASHMEM_LIFECYCLE
SkDebugf("=== ashmem close %d\n", fRec.fFD);
@@ -46,6 +49,7 @@ SkImageRef_ashmem::~SkImageRef_ashmem() {
SkASSERT(fRec.fSize);
munmap(fRec.fAddr, fRec.fSize);
close(fRec.fFD);
+ fRec.fFD = -1;
}
}
@@ -136,6 +140,7 @@ bool SkImageRef_ashmem::onDecode(SkImageDecoder* codec, SkStream* stream,
ashmem_unpin_region(fRec.fFD, 0, 0);
fRec.fPinned = false;
}
+ this->closeFD();
return false;
}
}
@@ -183,13 +188,16 @@ void* SkImageRef_ashmem::onLockPixels(SkColorTable** ct) {
void SkImageRef_ashmem::onUnlockPixels() {
this->INHERITED::onUnlockPixels();
- SkASSERT(-1 != fRec.fFD);
- SkASSERT(fRec.fAddr);
- SkASSERT(fRec.fPinned);
-
- ashmem_unpin_region(fRec.fFD, 0, 0);
- fRec.fPinned = false;
+ if (-1 != fRec.fFD) {
+ SkASSERT(fRec.fAddr);
+ SkASSERT(fRec.fPinned);
+
+ ashmem_unpin_region(fRec.fFD, 0, 0);
+ fRec.fPinned = false;
+ }
+ // we clear this with or without an error, since we've either closed or
+ // unpinned the region
fBitmap.setPixels(NULL, NULL);
}