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

Commit 39266357 authored by Anton Ivanov's avatar Anton Ivanov Committed by Android (Google) Code Review
Browse files

Revert "Delay initialization of a ConsumerBase instance to construction of a sp/wp."

This reverts commit 4efd0d93.

Reason for revert: Caused b/409264080

Bug: 393217449
Change-Id: Ia41cc9c08ce48d67f7b06b50adf6c573e4325482
parent 4efd0d93
Loading
Loading
Loading
Loading
+14 −18
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@
#include <gui/BufferItem.h>
#include <gui/BufferQueue.h>
#include <gui/ConsumerBase.h>
#include <gui/IConsumerListener.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
@@ -69,8 +68,8 @@ ConsumerBase::ConsumerBase(const sp<IGraphicBufferConsumer>& bufferQueue, bool c
#endif
        mAbandoned(false),
        mConsumer(bufferQueue),
        mPrevFinalReleaseFence(Fence::NO_FENCE),
        mIsControlledByApp(controlledByApp) {
        mPrevFinalReleaseFence(Fence::NO_FENCE) {
    initialize(controlledByApp);
}

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
@@ -80,11 +79,11 @@ ConsumerBase::ConsumerBase(bool controlledByApp, bool consumerIsSurfaceFlinger)
        mSlots(BufferQueueDefs::NUM_BUFFER_SLOTS),
#endif
        mAbandoned(false),
        mPrevFinalReleaseFence(Fence::NO_FENCE),
        mIsControlledByApp(controlledByApp) {
        mPrevFinalReleaseFence(Fence::NO_FENCE) {
    sp<IGraphicBufferProducer> producer;
    BufferQueue::createBufferQueue(&producer, &mConsumer, consumerIsSurfaceFlinger);
    mSurface = sp<Surface>::make(producer, controlledByApp);
    initialize(controlledByApp);
}

ConsumerBase::ConsumerBase(const sp<IGraphicBufferProducer>& producer,
@@ -96,27 +95,24 @@ ConsumerBase::ConsumerBase(const sp<IGraphicBufferProducer>& producer,
        mAbandoned(false),
        mConsumer(consumer),
        mSurface(sp<Surface>::make(producer, controlledByApp)),
        mPrevFinalReleaseFence(Fence::NO_FENCE),
        mIsControlledByApp(controlledByApp) {
        mPrevFinalReleaseFence(Fence::NO_FENCE) {
    initialize(controlledByApp);
}

#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)

void ConsumerBase::onFirstRef() {
    ConsumerListener::onFirstRef();
    initialize();
}

void ConsumerBase::initialize() {
void ConsumerBase::initialize(bool controlledByApp) {
    // Choose a name using the PID and a process-unique ID.
    mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());

    // Here we depend on an sp/wp having been created for `this`.  For this
    // reason, initialize() cannot be called from a ctor.
    wp<ConsumerListener> listener = wp<ConsumerListener>::fromExisting(this);
    sp<IConsumerListener> proxy = sp<BufferQueue::ProxyConsumerListener>::make(listener);
    // Note that we can't create an sp<...>(this) in a ctor that will not keep a
    // reference once the ctor ends, as that would cause the refcount of 'this'
    // dropping to 0 at the end of the ctor.  Since all we need is a wp<...>
    // that's what we create.
    wp<ConsumerListener> listener = static_cast<ConsumerListener*>(this);
    sp<IConsumerListener> proxy = new BufferQueue::ProxyConsumerListener(listener);

    status_t err = mConsumer->consumerConnect(proxy, mIsControlledByApp);
    status_t err = mConsumer->consumerConnect(proxy, controlledByApp);
    if (err != NO_ERROR) {
        CB_LOGE("ConsumerBase: error connecting to BufferQueue: %s (%d)",
                strerror(-err), err);
+1 −8
Original line number Diff line number Diff line
@@ -139,8 +139,7 @@ private:
    ConsumerBase(const ConsumerBase&);
    void operator=(const ConsumerBase&);

    // Requires `this` to be sp/wp so must not be called from ctor.
    void initialize();
    void initialize(bool controlledByApp);

protected:
    // ConsumerBase constructs a new ConsumerBase object to consume image
@@ -253,10 +252,6 @@ protected:
            const sp<GraphicBuffer> graphicBuffer,
            EGLDisplay display = EGL_NO_DISPLAY, EGLSyncKHR eglFence = EGL_NO_SYNC_KHR);
#endif
    // Required to complete initialization, so `final` lest overrides forget to
    // delegate.
    void onFirstRef() override final;

    // returns true iff the slot still has the graphicBuffer in it.
    bool stillTracking(int slot, const sp<GraphicBuffer> graphicBuffer);

@@ -332,8 +327,6 @@ protected:
    // releaseBufferLocked.
    sp<Fence> mPrevFinalReleaseFence;

    const bool mIsControlledByApp;

    // mMutex is the mutex used to prevent concurrent access to the member
    // variables of ConsumerBase objects. It must be locked whenever the
    // member variables are accessed or when any of the *Locked methods are