diff options
author | 2012-09-23 17:46:45 -0700 | |
---|---|---|
committer | 2012-09-23 17:49:24 -0700 | |
commit | 97dc9172b0e58979c63de0dedbab656399a62281 (patch) | |
tree | 291da7b2a7b35e73821fa3660c7e1a96e983a5e4 /libs/hwui/ResourceCache.cpp | |
parent | 4285de3c8bc77856a2df98894f74bb7333f1d348 (diff) |
Avoid deadlock when deleting layers
Bug #7217459
Change-Id: I12bfa6c30c5030bd1b23ea6a3ce64240ab1dfba3
Diffstat (limited to 'libs/hwui/ResourceCache.cpp')
-rw-r--r-- | libs/hwui/ResourceCache.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index 1c83ea463b4d..18d8324b8488 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -155,7 +155,7 @@ void ResourceCache::decrementRefcountLocked(void* resource) { } ref->refCount--; if (ref->refCount == 0) { - deleteResourceReference(resource, ref); + deleteResourceReferenceLocked(resource, ref); } } @@ -201,7 +201,7 @@ void ResourceCache::destructorLocked(SkPath* resource) { } ref->destroyed = true; if (ref->refCount == 0) { - deleteResourceReference(resource, ref); + deleteResourceReferenceLocked(resource, ref); } } @@ -223,7 +223,7 @@ void ResourceCache::destructorLocked(SkBitmap* resource) { } ref->destroyed = true; if (ref->refCount == 0) { - deleteResourceReference(resource, ref); + deleteResourceReferenceLocked(resource, ref); } } @@ -242,7 +242,7 @@ void ResourceCache::destructorLocked(SkiaShader* resource) { } ref->destroyed = true; if (ref->refCount == 0) { - deleteResourceReference(resource, ref); + deleteResourceReferenceLocked(resource, ref); } } @@ -261,7 +261,7 @@ void ResourceCache::destructorLocked(SkiaColorFilter* resource) { } ref->destroyed = true; if (ref->refCount == 0) { - deleteResourceReference(resource, ref); + deleteResourceReferenceLocked(resource, ref); } } @@ -284,7 +284,7 @@ void ResourceCache::recycleLocked(SkBitmap* resource) { } ref->recycled = true; if (ref->refCount == 0) { - deleteResourceReference(resource, ref); + deleteResourceReferenceLocked(resource, ref); } } @@ -292,7 +292,7 @@ void ResourceCache::recycleLocked(SkBitmap* resource) { * This method should only be called while the mLock mutex is held (that mutex is grabbed * by the various destructor() and recycle() methods which call this method). */ -void ResourceCache::deleteResourceReference(void* resource, ResourceReference* ref) { +void ResourceCache::deleteResourceReferenceLocked(void* resource, ResourceReference* ref) { if (ref->recycled && ref->resourceType == kBitmap) { ((SkBitmap*) resource)->setPixels(NULL, NULL); } @@ -326,6 +326,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r break; case kLayer: { Layer* layer = (Layer*) resource; + layer->freeResourcesLocked(); delete layer; } break; |