Skip to content

Commit 17ef62c

Browse files
committed
fix a possible dead-lock when clearing caches
Bug: 7195815 Change-Id: I8e226b7ec445f9f4fe46ae216ef7cc41efc5a0fd
1 parent 348f08f commit 17ef62c

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

libs/hwui/Caches.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -227,21 +227,29 @@ void Caches::clearGarbage() {
227227
textureCache.clearGarbage();
228228
pathCache.clearGarbage();
229229

230-
Mutex::Autolock _l(mGarbageLock);
230+
Vector<DisplayList*> displayLists;
231+
Vector<Layer*> layers;
232+
233+
{ // scope for the lock
234+
Mutex::Autolock _l(mGarbageLock);
235+
displayLists = mDisplayListGarbage;
236+
layers = mLayerGarbage;
237+
mDisplayListGarbage.clear();
238+
mLayerGarbage.clear();
239+
}
231240

232-
size_t count = mLayerGarbage.size();
241+
size_t count = displayLists.size();
233242
for (size_t i = 0; i < count; i++) {
234-
Layer* layer = mLayerGarbage.itemAt(i);
235-
delete layer;
243+
DisplayList* displayList = displayLists.itemAt(i);
244+
delete displayList;
236245
}
237-
mLayerGarbage.clear();
238246

239-
count = mDisplayListGarbage.size();
247+
count = layers.size();
240248
for (size_t i = 0; i < count; i++) {
241-
DisplayList* displayList = mDisplayListGarbage.itemAt(i);
242-
delete displayList;
249+
Layer* layer = layers.itemAt(i);
250+
delete layer;
243251
}
244-
mDisplayListGarbage.clear();
252+
layers.clear();
245253
}
246254

247255
void Caches::deleteLayerDeferred(Layer* layer) {

0 commit comments

Comments
 (0)