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

Commit 6983bc40 authored by Stan Iliev's avatar Stan Iliev
Browse files

Fix deadlock in render thread when Bitmap.prepareToDraw is invoked

Fix a deadlock with Skia pipelines, caused by calling
Bitmap::getSkBitmap from render thread.

Test: built and booted an image. Ran recent apps activity.
bug: 35060578
bug: 34926691
Change-Id: Iaf7957b955d938b722b153d72ad832ae5d50e86f
parent f6387d8a
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -667,12 +667,18 @@ CREATE_BRIDGE3(copyGraphicBufferInto, RenderThread* thread, GraphicBuffer* buffe
}

int RenderProxy::copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap) {
    RenderThread& thread = RenderThread::getInstance();
    if (Properties::isSkiaEnabled() && gettid() == thread.getTid()) {
        //TODO: fix everything that hits this. We should never be triggering a readback ourselves.
        return (int) thread.readback().copyGraphicBufferInto(buffer, bitmap);
    } else {
        SETUP_TASK(copyGraphicBufferInto);
    args->thread = &RenderThread::getInstance();
        args->thread = &thread;
        args->bitmap = bitmap;
        args->buffer = buffer;
        return static_cast<int>(reinterpret_cast<intptr_t>(staticPostAndWait(task)));
    }
}

void RenderProxy::post(RenderTask* task) {
    mRenderThread.queue(task);
@@ -690,6 +696,7 @@ void* RenderProxy::postAndWait(MethodInvokeRenderTask* task) {

void* RenderProxy::staticPostAndWait(MethodInvokeRenderTask* task) {
    RenderThread& thread = RenderThread::getInstance();
    LOG_ALWAYS_FATAL_IF(gettid() == thread.getTid());
    void* retval;
    task->setReturnPtr(&retval);
    thread.queueAndWait(task);