diff options
author | 2023-06-09 21:31:26 +0000 | |
---|---|---|
committer | 2023-08-17 21:00:03 +0000 | |
commit | 4cc1a633a629097fe1c30b07bebc64d69c544356 (patch) | |
tree | 817c446a5ebfe2f1299b2ff750f5c4c3324b7906 /libs/input/SpriteController.cpp | |
parent | 49ac12fa801aa7b735662d7c69d4cf459d41615a (diff) |
Strong pointer fixes in libinputservice
Make components of libinputservice work with implicit conversions
disabled for strong pointers.
Bug: 278783893
Test: Build
Change-Id: Ibe1e97c845662113437635efd7a1e875e8407c64
Diffstat (limited to 'libs/input/SpriteController.cpp')
-rw-r--r-- | libs/input/SpriteController.cpp | 55 |
1 files changed, 34 insertions, 21 deletions
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>& looper, int32_t overlayLaye ParentSurfaceProvider parentSurfaceProvider) : mLooper(looper), mOverlayLayer(overlayLayer), + mHandler(sp<Handler>::make()), mParentSurfaceProvider(std::move(parentSurfaceProvider)) { - mHandler = new WeakMessageHandler(this); mLocked.transactionNestingCount = 0; mLocked.deferredSpriteUpdate = false; } +void SpriteController::setHandlerController(const sp<android::SpriteController>& 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<Sprite> SpriteController::createSprite() { - return new SpriteImpl(this); + return sp<SpriteImpl>::make(sp<SpriteController>::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<SpriteImpl>& 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<SurfaceControl>& 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<SurfaceComposerClient>::make(); } } @@ -353,12 +349,29 @@ sp<SurfaceControl> SpriteController::obtainSurface(int32_t width, int32_t height return surfaceControl; } -// --- SpriteController::SpriteImpl --- +// --- SpriteController::Handler --- -SpriteController::SpriteImpl::SpriteImpl(const sp<SpriteController> 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<SpriteController>& 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<SpriteImpl>::fromExisting(this)); } } |