make ResourceCache for display lists thread-safe

Change-Id: I41885b4ae249d7d7c000bab17bf32340ba85ab3a
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index 9f18948..5ebd2c0 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -37,14 +37,17 @@
 }
 
 ResourceCache::ResourceCache() {
+    Mutex::Autolock _l(mLock);
     mCache = new KeyedVector<void *, ResourceReference *>();
 }
 
 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::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::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(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::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(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(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 @@
     }
 }
 
+/**
+ * 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);