Revert "Delay initialization of a ConsumerBase instance to construction of a sp/wp."
This reverts commit 4efd0d936e2a2bfd9a46432270d7960062265c7b.
Reason for revert: Caused b/409264080
Bug: 393217449
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:39266357b892a5b1f1d0a232d9706e512615b08d)
Merged-In: Ia41cc9c08ce48d67f7b06b50adf6c573e4325482
Change-Id: Ia41cc9c08ce48d67f7b06b50adf6c573e4325482
diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp
index 5b89c6e..1a975de 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 @@
#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 @@
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 @@
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 d2215ef..63c1ef3 100644
--- a/libs/gui/include/gui/ConsumerBase.h
+++ b/libs/gui/include/gui/ConsumerBase.h
@@ -139,8 +139,7 @@
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 @@
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 @@
// 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