diff options
author | 2025-04-18 15:50:20 -0700 | |
---|---|---|
committer | 2025-04-18 15:50:20 -0700 | |
commit | 2827a4a16b0340ecd07c2d5a6c89991799b362bb (patch) | |
tree | 7b9b9705546fdad50c1a0dc6bd44cff755f12df6 | |
parent | 127ec1126440ac6e1ff201b42cbec5f871e21055 (diff) | |
parent | 08511a88f70aee78d3ac9cb1d98a0803ff80befa (diff) |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/33054523'] into 25Q2-release.
Change-Id: I8990f5caa694b2c362e9dbce8814dd77e2effe36
-rw-r--r-- | libs/gui/ConsumerBase.cpp | 32 | ||||
-rw-r--r-- | libs/gui/include/gui/ConsumerBase.h | 9 |
2 files changed, 15 insertions, 26 deletions
diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp index 5b89c6e17e..1a975de08d 100644 --- a/libs/gui/ConsumerBase.cpp +++ b/libs/gui/ConsumerBase.cpp @@ -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); diff --git a/libs/gui/include/gui/ConsumerBase.h b/libs/gui/include/gui/ConsumerBase.h index d2215ef7e6..63c1ef3132 100644 --- a/libs/gui/include/gui/ConsumerBase.h +++ b/libs/gui/include/gui/ConsumerBase.h @@ -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 @@ -255,10 +254,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); @@ -334,8 +329,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 |