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

Commit f0b6921e authored by John Reck's avatar John Reck
Browse files

Revert "Delete RenderProxy off of the cleaner thread"

This reverts commit da355968.

Bug: b/192050906

If too many RenderProxies are destroyed too quickly, we can end up jamming up the CommonPool preventing RenderThread from making progress if it's waiting on CommonPool tasks.

Change-Id: I8c324bc60891440d9b7be67961f8d5f881dc0f03
parent da355968
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);
    RenderProxy::asyncDelete(proxy);
    delete proxy;
}

static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz,
+0 −12
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@
#include "renderthread/CanvasContext.h"
#include "renderthread/RenderTask.h"
#include "renderthread/RenderThread.h"
#include "thread/CommonPool.h"
#include "utils/Macros.h"
#include "utils/TimeUtils.h"

@@ -43,17 +42,6 @@ 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();
}
+2 −6
Original line number Diff line number Diff line
@@ -62,14 +62,10 @@ enum {
 * references RenderProxy fields. This is safe as RenderProxy cannot
 * be deleted if it is blocked inside a call.
 */
class RenderProxy final {
class RenderProxy {
public:
    RenderProxy(bool opaque, RenderNode* rootNode, IContextFactory* contextFactory);
    ~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*);
    virtual ~RenderProxy();

    // Won't take effect until next EGLSurface creation
    void setSwapBehavior(SwapBehavior swapBehavior);