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

Commit ac12ae73 authored by Valerie Hau's avatar Valerie Hau
Browse files

Clear all pending transactions on screen wakeup

If an app sets a transaction that modifies layer state, but does not get
committed by an SF composition cycle, we may end up dangling some
callbacks.  Temporary fix is to clear and send callbacks on wakeup

Bug: 141111965
Test: build, boot, manual
Change-Id: I781124c3f96174cefd5eb67e597c13f923df4fc1
parent 1c2a53e6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3726,6 +3726,8 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int

    if (currentMode == HWC_POWER_MODE_OFF) {
        // Turn on the display
        // TODO: @vhau temp fix only!  See b/141111965
        mTransactionCompletedThread.clearAllPending();
        getHwComposer().setPowerMode(*displayId, mode);
        if (display->isPrimary() && mode != HWC_POWER_MODE_DOZE_SUSPEND) {
            setVsyncEnabledInHWC(*displayId, mHWCVsyncPendingState);
+9 −0
Original line number Diff line number Diff line
@@ -189,6 +189,15 @@ status_t TransactionCompletedThread::finalizePendingCallbackHandles(
    return NO_ERROR;
}

void TransactionCompletedThread::clearAllPending() {
    std::lock_guard lock(mMutex);
    if (!mRunning) {
        return;
    }
    mPendingTransactions.clear();
    mConditionVariable.notify_all();
}

status_t TransactionCompletedThread::registerUnpresentedCallbackHandle(
        const sp<CallbackHandle>& handle) {
    std::lock_guard lock(mMutex);
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ public:
    // Notifies the TransactionCompletedThread that a pending CallbackHandle has been presented.
    status_t finalizePendingCallbackHandles(const std::deque<sp<CallbackHandle>>& handles);

    void clearAllPending();

    // Adds the Transaction CallbackHandle from a layer that does not need to be relatched and
    // presented this frame.
    status_t registerUnpresentedCallbackHandle(const sp<CallbackHandle>& handle);