From e7d2295c06ef9b9df6336cbff23007a13fb3f6e4 Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Thu, 11 Nov 2010 16:30:16 -0800 Subject: make ResourceCache for display lists thread-safe Change-Id: I41885b4ae249d7d7c000bab17bf32340ba85ab3a --- libs/hwui/ResourceCache.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'libs/hwui/ResourceCache.cpp') diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index 9f189482941e..5ebd2c0a14ba 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -37,14 +37,17 @@ void ResourceCache::logCache() { } ResourceCache::ResourceCache() { + Mutex::Autolock _l(mLock); mCache = new KeyedVector(); } ResourceCache::~ResourceCache() { + Mutex::Autolock _l(mLock); delete mCache; } void ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) { + Mutex::Autolock _l(mLock); for (size_t i = 0; i < mCache->size(); ++i) { void* ref = mCache->valueAt(i); } @@ -73,6 +76,7 @@ void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) { } void ResourceCache::decrementRefcount(void* resource) { + Mutex::Autolock _l(mLock); ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL) { // Should not get here - shouldn't get a call to decrement if we're not yet tracking it @@ -101,6 +105,7 @@ void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) { } void ResourceCache::recycle(SkBitmap* resource) { + Mutex::Autolock _l(mLock); if (mCache->indexOfKey(resource) < 0) { // not tracking this resource; just recycle the pixel data resource->setPixels(NULL, NULL); @@ -110,6 +115,7 @@ void ResourceCache::recycle(SkBitmap* resource) { } void ResourceCache::recycle(void* resource) { + Mutex::Autolock _l(mLock); ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL) { // Should not get here - shouldn't get a call to recycle if we're not yet tracking it @@ -122,6 +128,7 @@ void ResourceCache::recycle(void* resource) { } void ResourceCache::destructor(SkBitmap* resource) { + Mutex::Autolock _l(mLock); ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL) { // If we're not tracking this resource, just delete it @@ -139,6 +146,7 @@ void ResourceCache::destructor(SkBitmap* resource) { } void ResourceCache::destructor(SkiaShader* resource) { + Mutex::Autolock _l(mLock); ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL) { // If we're not tracking this resource, just delete it @@ -156,6 +164,7 @@ void ResourceCache::destructor(SkiaShader* resource) { } void ResourceCache::destructor(SkiaColorFilter* resource) { + Mutex::Autolock _l(mLock); ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL) { // If we're not tracking this resource, just delete it @@ -169,6 +178,10 @@ void ResourceCache::destructor(SkiaColorFilter* 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) { if (ref->recycled && ref->resourceType == kBitmap) { ((SkBitmap*) resource)->setPixels(NULL, NULL); -- cgit v1.2.3-59-g8ed1b