Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61f9897a authored by Rob Carr's avatar Rob Carr Committed by Automerger Merge Worker
Browse files

Merge "Delete RenderProxy off of the cleaner thread" into sc-dev am: 472d9624 am: 0e3c2f4c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15098757

Change-Id: I20df0a97c74261e28942273df1b178e34551b88d
parents a1c37703 0e3c2f4c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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,
+12 −0
Original line number Diff line number Diff line
@@ -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();
}
+6 −2
Original line number Diff line number Diff line
@@ -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);