Delete display list objects and resources on the UI thread
Bug #6073717
Bug #6065504
Bug #6026515
Bug #5971725
Prior to this patch, the destructor of DisplayList would always run
on the finalizer thread. This could cause a race condition if the UI
thread was busy rendering display lists at the same time leading to
various random native crashes.
Change-Id: Ie11108e3b1538d4b358a1a8b4cce1b2d33152d0c
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 0ef8469..123695a 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -20,6 +20,7 @@
#include <utils/String8.h>
#include "Caches.h"
+#include "DisplayListRenderer.h"
#include "Properties.h"
#include "LayerRenderer.h"
@@ -199,6 +200,13 @@
LayerRenderer::destroyLayer(layer);
}
mLayerGarbage.clear();
+
+ count = mDisplayListGarbage.size();
+ for (size_t i = 0; i < count; i++) {
+ DisplayList* displayList = mDisplayListGarbage.itemAt(i);
+ delete displayList;
+ }
+ mDisplayListGarbage.clear();
}
void Caches::deleteLayerDeferred(Layer* layer) {
@@ -206,6 +214,11 @@
mLayerGarbage.push(layer);
}
+void Caches::deleteDisplayListDeferred(DisplayList* displayList) {
+ Mutex::Autolock _l(mGarbageLock);
+ mDisplayListGarbage.push(displayList);
+}
+
void Caches::flush(FlushMode mode) {
FLUSH_LOGD("Flushing caches (mode %d)", mode);