Skip to content

Commit 27955ee

Browse files
author
Anton Ivanov
committed
Harden construction of BBQ and its helpers.
BLASTBufferQueue and related classes are meant to be refcounted, so ensure they are constructed with sp<>::make(). Enforce this invariant by making constructors private. Bug: 393217449 Test: presubmit Flag: EXEMPT_refactor Change-Id: I093ca5f220abcce775c36470a1d304fb03a2206c
1 parent a3d7a6f commit 27955ee

3 files changed

Lines changed: 35 additions & 30 deletions

File tree

libs/gui/BLASTBufferQueue.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,15 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, bool updateDestinati
197197
mUpdateDestinationFrame(updateDestinationFrame) {
198198
createBufferQueue(&mProducer, &mConsumer);
199199
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
200-
mBufferItemConsumer = new BLASTBufferItemConsumer(mProducer, mConsumer,
201-
GraphicBuffer::USAGE_HW_COMPOSER |
202-
GraphicBuffer::USAGE_HW_TEXTURE,
203-
1, false, this);
200+
mBufferItemConsumer = sp<BLASTBufferItemConsumer>::make(mProducer, mConsumer,
201+
GraphicBuffer::USAGE_HW_COMPOSER |
202+
GraphicBuffer::USAGE_HW_TEXTURE,
203+
1, false, this);
204204
#else
205-
mBufferItemConsumer = new BLASTBufferItemConsumer(mConsumer,
206-
GraphicBuffer::USAGE_HW_COMPOSER |
207-
GraphicBuffer::USAGE_HW_TEXTURE,
208-
1, false, this);
205+
mBufferItemConsumer = sp<BLASTBufferItemConsumer>::make(mConsumer,
206+
GraphicBuffer::USAGE_HW_COMPOSER |
207+
GraphicBuffer::USAGE_HW_TEXTURE,
208+
1, false, this);
209209
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
210210
// since the adapter is in the client process, set dequeue timeout
211211
// explicitly so that dequeueBuffer will block
@@ -1120,10 +1120,10 @@ ANDROID_SINGLETON_STATIC_INSTANCE(AsyncWorker);
11201120
class AsyncProducerListener : public BnProducerListener {
11211121
private:
11221122
const sp<IProducerListener> mListener;
1123-
1124-
public:
11251123
AsyncProducerListener(const sp<IProducerListener>& listener) : mListener(listener) {}
1124+
friend class sp<AsyncProducerListener>;
11261125

1126+
public:
11271127
void onBufferReleased() override {
11281128
AsyncWorker::getInstance().post([listener = mListener]() { listener->onBufferReleased(); });
11291129
}
@@ -1177,7 +1177,7 @@ class BBQBufferQueueProducer : public BufferQueueProducer {
11771177
return BufferQueueProducer::connect(listener, api, producerControlledByApp, output);
11781178
}
11791179

1180-
return BufferQueueProducer::connect(new AsyncProducerListener(listener), api,
1180+
return BufferQueueProducer::connect(sp<AsyncProducerListener>::make(listener), api,
11811181
producerControlledByApp, output);
11821182
}
11831183

libs/gui/include/gui/BLASTBufferQueue.h

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,6 @@ class BufferItemConsumer;
4646

4747
class BLASTBufferItemConsumer : public BufferItemConsumer {
4848
public:
49-
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
50-
BLASTBufferItemConsumer(const sp<IGraphicBufferProducer>& producer,
51-
const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
52-
int bufferCount, bool controlledByApp, wp<BLASTBufferQueue> bbq)
53-
: BufferItemConsumer(producer, consumer, consumerUsage, bufferCount, controlledByApp),
54-
#else
55-
BLASTBufferItemConsumer(const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
56-
int bufferCount, bool controlledByApp, wp<BLASTBufferQueue> bbq)
57-
: BufferItemConsumer(consumer, consumerUsage, bufferCount, controlledByApp),
58-
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
59-
mBLASTBufferQueue(std::move(bbq)),
60-
mCurrentlyConnected(false),
61-
mPreviouslyConnected(false) {
62-
}
63-
6449
void onDisconnect() override EXCLUDES(mMutex);
6550
void addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
6651
FrameEventHistoryDelta* outDelta) override EXCLUDES(mMutex);
@@ -81,6 +66,23 @@ class BLASTBufferItemConsumer : public BufferItemConsumer {
8166
#endif
8267

8368
private:
69+
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
70+
BLASTBufferItemConsumer(const sp<IGraphicBufferProducer>& producer,
71+
const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
72+
int bufferCount, bool controlledByApp, wp<BLASTBufferQueue> bbq)
73+
: BufferItemConsumer(producer, consumer, consumerUsage, bufferCount, controlledByApp),
74+
#else
75+
BLASTBufferItemConsumer(const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
76+
int bufferCount, bool controlledByApp, wp<BLASTBufferQueue> bbq)
77+
: BufferItemConsumer(consumer, consumerUsage, bufferCount, controlledByApp),
78+
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
79+
mBLASTBufferQueue(std::move(bbq)),
80+
mCurrentlyConnected(false),
81+
mPreviouslyConnected(false) {
82+
}
83+
84+
friend class sp<BLASTBufferItemConsumer>;
85+
8486
const wp<BLASTBufferQueue> mBLASTBufferQueue;
8587

8688
uint64_t mCurrentFrameNumber GUARDED_BY(mMutex) = 0;
@@ -94,8 +96,6 @@ class BLASTBufferItemConsumer : public BufferItemConsumer {
9496

9597
class BLASTBufferQueue : public ConsumerBase::FrameAvailableListener {
9698
public:
97-
BLASTBufferQueue(const std::string& name, bool updateDestinationFrame = true);
98-
9999
sp<IGraphicBufferProducer> getIGraphicBufferProducer() const {
100100
return mProducer;
101101
}
@@ -158,8 +158,13 @@ class BLASTBufferQueue : public ConsumerBase::FrameAvailableListener {
158158
void onFirstRef() override;
159159

160160
private:
161+
// Not public to ensure construction via sp<>::make().
162+
BLASTBufferQueue(const std::string& name, bool updateDestinationFrame = true);
163+
164+
friend class sp<BLASTBufferQueue>;
161165
friend class BLASTBufferQueueHelper;
162166
friend class BBQBufferQueueProducer;
167+
friend class TestBLASTBufferQueue;
163168
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BUFFER_RELEASE_CHANNEL)
164169
friend class BBQBufferQueueCore;
165170
#endif

libs/gui/tests/BLASTBufferQueue_test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ class TestBLASTBufferQueue : public BLASTBufferQueue {
114114
class BLASTBufferQueueHelper {
115115
public:
116116
BLASTBufferQueueHelper(const sp<SurfaceControl>& sc, int width, int height) {
117-
mBlastBufferQueueAdapter = new TestBLASTBufferQueue("TestBLASTBufferQueue", sc, width,
118-
height, PIXEL_FORMAT_RGBA_8888);
117+
mBlastBufferQueueAdapter = sp<TestBLASTBufferQueue>::make("TestBLASTBufferQueue", sc, width,
118+
height, PIXEL_FORMAT_RGBA_8888);
119119
}
120120

121121
void update(const sp<SurfaceControl>& sc, int width, int height) {

0 commit comments

Comments
 (0)