Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cc1a633 authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

Strong pointer fixes in libinputservice

Make components of libinputservice work with implicit conversions
disabled for strong pointers.

Bug: 278783893
Test: Build

Change-Id: Ibe1e97c845662113437635efd7a1e875e8407c64
parent 49ac12fa
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -23,6 +23,12 @@ package {

cc_library_shared {
    name: "libinputservice",
    defaults: [
        // Build using the same flags and configurations as inputflinger.
        "inputflinger_defaults",
    ],
    host_supported: false,

    srcs: [
        "PointerController.cpp",
        "PointerControllerContext.cpp",
@@ -50,12 +56,4 @@ cc_library_shared {
    ],

    include_dirs: ["frameworks/native/services"],

    cflags: [
        "-Wall",
        "-Wextra",
        "-Werror",
        "-Wthread-safety",
    ],

}
+1 −1
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>&
                                     WindowListenerConsumer unregisterListener)
      : mContext(policy, looper, spriteController, *this),
        mCursorController(mContext),
        mDisplayInfoListener(new DisplayInfoListener(this)),
        mDisplayInfoListener(sp<DisplayInfoListener>::make(this)),
        mUnregisterWindowInfosListener(std::move(unregisterListener)) {
    std::scoped_lock lock(getLock());
    mLocked.presentation = Presentation::SPOT;
+2 −2
Original line number Diff line number Diff line
@@ -36,8 +36,8 @@ PointerControllerContext::PointerControllerContext(
      : mPolicy(policy),
        mLooper(looper),
        mSpriteController(spriteController),
        mHandler(new MessageHandler()),
        mCallback(new LooperCallback()),
        mHandler(sp<MessageHandler>::make()),
        mCallback(sp<LooperCallback>::make()),
        mController(controller),
        mAnimator(*this) {
    std::scoped_lock lock(mLock);
+34 −21
Original line number Diff line number Diff line
@@ -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));
    }
}

+12 −7
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ public:
 *
 * Clients are responsible for animating sprites by periodically updating their properties.
 */
class SpriteController : public MessageHandler {
class SpriteController : public RefBase {
protected:
    virtual ~SpriteController();

@@ -117,6 +117,9 @@ public:
    using ParentSurfaceProvider = std::function<sp<SurfaceControl>(int /*displayId*/)>;
    SpriteController(const sp<Looper>& looper, int32_t overlayLayer, ParentSurfaceProvider parent);

    /* Initialize the callback for the message handler. */
    void setHandlerController(const sp<SpriteController>& controller);

    /* Creates a new sprite, initially invisible. */
    virtual sp<Sprite> createSprite();

@@ -129,9 +132,12 @@ public:
    virtual void closeTransaction();

private:
    enum {
        MSG_UPDATE_SPRITES,
        MSG_DISPOSE_SURFACES,
    class Handler : public virtual android::MessageHandler {
    public:
        enum { MSG_UPDATE_SPRITES, MSG_DISPOSE_SURFACES };

        void handleMessage(const Message& message) override;
        wp<SpriteController> spriteController;
    };

    enum {
@@ -192,7 +198,7 @@ private:
        virtual ~SpriteImpl();

    public:
        explicit SpriteImpl(const sp<SpriteController> controller);
        explicit SpriteImpl(const sp<SpriteController>& controller);

        virtual void setIcon(const SpriteIcon& icon);
        virtual void setVisible(bool visible);
@@ -245,7 +251,7 @@ private:

    sp<Looper> mLooper;
    const int32_t mOverlayLayer;
    sp<WeakMessageHandler> mHandler;
    sp<Handler> mHandler;
    ParentSurfaceProvider mParentSurfaceProvider;

    sp<SurfaceComposerClient> mSurfaceComposerClient;
@@ -260,7 +266,6 @@ private:
    void invalidateSpriteLocked(const sp<SpriteImpl>& sprite);
    void disposeSurfaceLocked(const sp<SurfaceControl>& surfaceControl);

    void handleMessage(const Message& message);
    void doUpdateSprites();
    void doDisposeSurfaces();

Loading