Merge "Delete RenderProxy off of the cleaner thread" into sc-dev am: 472d962453
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15098757 Change-Id: I48b5f4b421d2d6e2fe7926cebf7adc58e664051c
This commit is contained in:
@@ -247,7 +247,7 @@ static jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject claz
|
||||
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,
|
||||
|
||||
@@ -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 @@ RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode,
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -62,10 +62,14 @@ enum {
|
||||
* 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);
|
||||
|
||||
Reference in New Issue
Block a user