fix a possible dead-lock when clearing caches
Bug: 7195815
Change-Id: I8e226b7ec445f9f4fe46ae216ef7cc41efc5a0fd
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 4459495..f0f72f9 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -227,21 +227,29 @@
textureCache.clearGarbage();
pathCache.clearGarbage();
- Mutex::Autolock _l(mGarbageLock);
+ Vector<DisplayList*> displayLists;
+ Vector<Layer*> layers;
- size_t count = mLayerGarbage.size();
- for (size_t i = 0; i < count; i++) {
- Layer* layer = mLayerGarbage.itemAt(i);
- delete layer;
+ { // scope for the lock
+ Mutex::Autolock _l(mGarbageLock);
+ displayLists = mDisplayListGarbage;
+ layers = mLayerGarbage;
+ mDisplayListGarbage.clear();
+ mLayerGarbage.clear();
}
- mLayerGarbage.clear();
- count = mDisplayListGarbage.size();
+ size_t count = displayLists.size();
for (size_t i = 0; i < count; i++) {
- DisplayList* displayList = mDisplayListGarbage.itemAt(i);
+ DisplayList* displayList = displayLists.itemAt(i);
delete displayList;
}
- mDisplayListGarbage.clear();
+
+ count = layers.size();
+ for (size_t i = 0; i < count; i++) {
+ Layer* layer = layers.itemAt(i);
+ delete layer;
+ }
+ layers.clear();
}
void Caches::deleteLayerDeferred(Layer* layer) {