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

Commit c1d22e99 authored by Jim Shargo's avatar Jim Shargo Committed by Android (Google) Code Review
Browse files

Merge "Surface: return early from dequeueBuffer on failure" into main

parents aa9f90b6 650e25db
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -745,9 +745,14 @@ status_t Surface::dequeueBuffer(sp<GraphicBuffer>* buffer, sp<Fence>* outFence)
        return BAD_VALUE;
    }

    android_native_buffer_t* anb;
    android_native_buffer_t* anb = nullptr;
    int fd = -1;
    status_t res = dequeueBuffer(&anb, &fd);
    if (res != NO_ERROR) {
        ALOGV("dequeueBuffer() returned %d", res);
        return res;
    }

    *buffer = GraphicBuffer::from(anb);
    *outFence = sp<Fence>::make(fd);
    return res;
+23 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@

#include "Constants.h"
#include "MockConsumer.h"
#include "hardware/gralloc.h"
#include "testserver/TestServerClient.h"

namespace android {
@@ -2427,6 +2428,28 @@ TEST_F(SurfaceTest, QueueAcquireReleaseDequeue_CalledInStack_DoesNotDeadlock) {
    EXPECT_EQ(OK, surface->disconnect(NATIVE_WINDOW_API_CPU));
}

// See: b/414442592
TEST_F(SurfaceTest, DequeueBuffer_WithDeadConsumer_DoesNotCrash) {
    auto [consumer, surface] = BufferItemConsumer::create(GRALLOC_USAGE_SW_READ_OFTEN);

    sp<SurfaceListener> surfaceListener = sp<StubSurfaceListener>::make();
    EXPECT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, surfaceListener, false));

    sp<GraphicBuffer> buffer;
    sp<Fence> fence;
    EXPECT_EQ(OK, surface->dequeueBuffer(&buffer, &fence));
    EXPECT_EQ(OK, surface->queueBuffer(buffer, fence));

    consumer->abandon();

    auto beforeBuffer = buffer;
    auto beforeFence = fence;

    EXPECT_NE(OK, surface->dequeueBuffer(&buffer, &fence));
    EXPECT_EQ(buffer, beforeBuffer);
    EXPECT_EQ(fence, beforeFence);
}

TEST_F(SurfaceTest, ViewSurface_toString) {
    view::Surface surface{};
    EXPECT_EQ("", surface.toString());