Avoid deadlock when deleting layers
Bug #7217459

Change-Id: I12bfa6c30c5030bd1b23ea6a3ce64240ab1dfba3
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index 1c83ea4..18d8324 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -155,7 +155,7 @@
     }
     ref->refCount--;
     if (ref->refCount == 0) {
-        deleteResourceReference(resource, ref);
+        deleteResourceReferenceLocked(resource, ref);
     }
 }
 
@@ -201,7 +201,7 @@
     }
     ref->destroyed = true;
     if (ref->refCount == 0) {
-        deleteResourceReference(resource, ref);
+        deleteResourceReferenceLocked(resource, ref);
     }
 }
 
@@ -223,7 +223,7 @@
     }
     ref->destroyed = true;
     if (ref->refCount == 0) {
-        deleteResourceReference(resource, ref);
+        deleteResourceReferenceLocked(resource, ref);
     }
 }
 
@@ -242,7 +242,7 @@
     }
     ref->destroyed = true;
     if (ref->refCount == 0) {
-        deleteResourceReference(resource, ref);
+        deleteResourceReferenceLocked(resource, ref);
     }
 }
 
@@ -261,7 +261,7 @@
     }
     ref->destroyed = true;
     if (ref->refCount == 0) {
-        deleteResourceReference(resource, ref);
+        deleteResourceReferenceLocked(resource, ref);
     }
 }
 
@@ -284,7 +284,7 @@
     }
     ref->recycled = true;
     if (ref->refCount == 0) {
-        deleteResourceReference(resource, ref);
+        deleteResourceReferenceLocked(resource, ref);
     }
 }
 
@@ -292,7 +292,7 @@
  * 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 @@
             break;
             case kLayer: {
                 Layer* layer = (Layer*) resource;
+                layer->freeResourcesLocked();
                 delete layer;
             }
             break;