diff options
-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 |