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