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

Commit bbd57bc5 authored by Prabir Pradhan's avatar Prabir Pradhan Committed by Android (Google) Code Review
Browse files

Merge "Strong pointer fixes in libinputservice" into main

parents 415f0ea8 4cc1a633
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