be sure to unlock the discardablememory before deleting it

BUG=

Review URL: https://codereview.chromium.org/114673002

git-svn-id: http://skia.googlecode.com/svn/trunk@12658 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2013-12-12 22:37:32 +00:00
parent 9c5435de44
commit 1d0654f69d
3 changed files with 21 additions and 1 deletions

View File

@ -47,19 +47,23 @@ SkPoolDiscardableMemory::SkPoolDiscardableMemory(SkDiscardableMemoryPool* pool,
}
SkPoolDiscardableMemory::~SkPoolDiscardableMemory() {
SkASSERT(!fLocked); // contract for SkDiscardableMemory
fPool->free(this);
fPool->unref();
}
bool SkPoolDiscardableMemory::lock() {
SkASSERT(!fLocked); // contract for SkDiscardableMemory
return fPool->lock(this);
}
void* SkPoolDiscardableMemory::data() {
return fLocked ? fPointer : NULL;
SkASSERT(fLocked); // contract for SkDiscardableMemory
return fPointer;
}
void SkPoolDiscardableMemory::unlock() {
SkASSERT(fLocked); // contract for SkDiscardableMemory
fPool->unlock(this);
}

View File

@ -30,6 +30,9 @@ SkDiscardablePixelRef::SkDiscardablePixelRef(SkImageGenerator* generator,
}
SkDiscardablePixelRef::~SkDiscardablePixelRef() {
if (this->isLocked()) {
fDiscardableMemory->unlock();
}
SkDELETE(fDiscardableMemory);
SkSafeUnref(fDMFactory);
SkDELETE(fGenerator);

View File

@ -268,12 +268,25 @@ void CheckPixelRef(TestImageGenerator::TestType type,
}
}
} // namespace
// new/lock/delete is an odd pattern for a pixelref, but it needs to not assert
static void test_newlockdelete(skiatest::Reporter* reporter) {
SkBitmap bm;
SkImageGenerator* ig = new TestImageGenerator(
TestImageGenerator::kSucceedGetPixels_TestType,
reporter);
SkInstallDiscardablePixelRef(ig, &bm, NULL);
bm.pixelRef()->lockPixels();
}
/**
* This tests the basic functionality of SkDiscardablePixelRef with a
* basic SkImageGenerator implementation and several
* SkDiscardableMemory::Factory choices.
*/
DEF_TEST(DiscardableAndCachingPixelRef, reporter) {
test_newlockdelete(reporter);
CheckPixelRef(TestImageGenerator::kFailGetInfo_TestType,
reporter, kSkCaching_PixelRefType, NULL);
CheckPixelRef(TestImageGenerator::kFailGetPixels_TestType,