From 4cc1a633a629097fe1c30b07bebc64d69c544356 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Fri, 9 Jun 2023 21:31:26 +0000 Subject: Strong pointer fixes in libinputservice Make components of libinputservice work with implicit conversions disabled for strong pointers. Bug: 278783893 Test: Build Change-Id: Ibe1e97c845662113437635efd7a1e875e8407c64 --- libs/input/SpriteController.cpp | 55 +++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 21 deletions(-) (limited to 'libs/input/SpriteController.cpp') diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp index 130b204954b4..d40f49e4bc38 100644 --- a/libs/input/SpriteController.cpp +++ b/libs/input/SpriteController.cpp @@ -31,12 +31,19 @@ SpriteController::SpriteController(const sp& looper, int32_t overlayLaye ParentSurfaceProvider parentSurfaceProvider) : mLooper(looper), mOverlayLayer(overlayLayer), + mHandler(sp::make()), mParentSurfaceProvider(std::move(parentSurfaceProvider)) { - mHandler = new WeakMessageHandler(this); mLocked.transactionNestingCount = 0; mLocked.deferredSpriteUpdate = false; } +void SpriteController::setHandlerController(const sp& controller) { + // Initialize the weak message handler outside the constructor, because we cannot get a strong + // pointer to self in the constructor as the initial ref count is only incremented after + // construction. + mHandler->spriteController = controller; +} + SpriteController::~SpriteController() { mLooper->removeMessages(mHandler); @@ -47,7 +54,7 @@ SpriteController::~SpriteController() { } sp SpriteController::createSprite() { - return new SpriteImpl(this); + return sp::make(sp::fromExisting(this)); } void SpriteController::openTransaction() { @@ -65,7 +72,7 @@ void SpriteController::closeTransaction() { mLocked.transactionNestingCount -= 1; if (mLocked.transactionNestingCount == 0 && mLocked.deferredSpriteUpdate) { mLocked.deferredSpriteUpdate = false; - mLooper->sendMessage(mHandler, Message(MSG_UPDATE_SPRITES)); + mLooper->sendMessage(mHandler, Message(Handler::MSG_UPDATE_SPRITES)); } } @@ -76,7 +83,7 @@ void SpriteController::invalidateSpriteLocked(const sp& sprite) { if (mLocked.transactionNestingCount != 0) { mLocked.deferredSpriteUpdate = true; } else { - mLooper->sendMessage(mHandler, Message(MSG_UPDATE_SPRITES)); + mLooper->sendMessage(mHandler, Message(Handler::MSG_UPDATE_SPRITES)); } } } @@ -85,18 +92,7 @@ void SpriteController::disposeSurfaceLocked(const sp& surfaceCon bool wasEmpty = mLocked.disposedSurfaces.empty(); mLocked.disposedSurfaces.push_back(surfaceControl); if (wasEmpty) { - mLooper->sendMessage(mHandler, Message(MSG_DISPOSE_SURFACES)); - } -} - -void SpriteController::handleMessage(const Message& message) { - switch (message.what) { - case MSG_UPDATE_SPRITES: - doUpdateSprites(); - break; - case MSG_DISPOSE_SURFACES: - doDisposeSurfaces(); - break; + mLooper->sendMessage(mHandler, Message(Handler::MSG_DISPOSE_SURFACES)); } } @@ -327,7 +323,7 @@ void SpriteController::doDisposeSurfaces() { void SpriteController::ensureSurfaceComposerClient() { if (mSurfaceComposerClient == NULL) { - mSurfaceComposerClient = new SurfaceComposerClient(); + mSurfaceComposerClient = sp::make(); } } @@ -353,12 +349,29 @@ sp SpriteController::obtainSurface(int32_t width, int32_t height return surfaceControl; } -// --- SpriteController::SpriteImpl --- +// --- SpriteController::Handler --- -SpriteController::SpriteImpl::SpriteImpl(const sp controller) : - mController(controller) { +void SpriteController::Handler::handleMessage(const android::Message& message) { + auto controller = spriteController.promote(); + if (!controller) { + return; + } + + switch (message.what) { + case MSG_UPDATE_SPRITES: + controller->doUpdateSprites(); + break; + case MSG_DISPOSE_SURFACES: + controller->doDisposeSurfaces(); + break; + } } +// --- SpriteController::SpriteImpl --- + +SpriteController::SpriteImpl::SpriteImpl(const sp& controller) + : mController(controller) {} + SpriteController::SpriteImpl::~SpriteImpl() { AutoMutex _m(mController->mLock); @@ -461,7 +474,7 @@ void SpriteController::SpriteImpl::invalidateLocked(uint32_t dirty) { mLocked.state.dirty |= dirty; if (!wasDirty) { - mController->invalidateSpriteLocked(this); + mController->invalidateSpriteLocked(sp::fromExisting(this)); } } -- cgit v1.2.3-59-g8ed1b