diff options
Diffstat (limited to 'skia/ports/SkImageRef_ashmem.cpp')
-rw-r--r-- | skia/ports/SkImageRef_ashmem.cpp | 20 |
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); } |