Merge "Delete RenderProxy off of the cleaner thread" into sc-dev
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
index 4d31cd9..b2ff38c 100644
--- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
+++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
@@ -247,7 +247,7 @@
 static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
         jlong proxyPtr) {
     RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
-    delete proxy;
+    RenderProxy::asyncDelete(proxy);
 }
 
 static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz,
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index a77b5b5..e538a92 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -26,6 +26,7 @@
 #include "renderthread/CanvasContext.h"
 #include "renderthread/RenderTask.h"
 #include "renderthread/RenderThread.h"
+#include "thread/CommonPool.h"
 #include "utils/Macros.h"
 #include "utils/TimeUtils.h"
 
@@ -42,6 +43,17 @@
     mDrawFrameTask.setContext(&mRenderThread, mContext, rootRenderNode);
 }
 
+void RenderProxy::asyncDelete(RenderProxy* proxy) {
+    if (!proxy) return;
+
+    if (proxy->mContext) {
+        // Use the common pool because ~RenderProxy blocks on calling into RenderThread
+        CommonPool::post([proxy]() { delete proxy; });
+    } else {
+        delete proxy;
+    }
+}
+
 RenderProxy::~RenderProxy() {
     destroyContext();
 }
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 1b0f22e..5f6b5cd 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -62,10 +62,14 @@
  * references RenderProxy fields. This is safe as RenderProxy cannot
  * be deleted if it is blocked inside a call.
  */
-class RenderProxy {
+class RenderProxy final {
 public:
     RenderProxy(bool opaque, RenderNode* rootNode, IContextFactory* contextFactory);
-    virtual ~RenderProxy();
+    ~RenderProxy();
+
+    // Schedules a delete of the RenderProxy at a later date. Avoids blocking the current thread
+    // on destruction which ~RenderProxy does by default.
+    static void asyncDelete(RenderProxy*);
 
     // Won't take effect until next EGLSurface creation
     void setSwapBehavior(SwapBehavior swapBehavior);