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

Commit c83110d4 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android (Google) Code Review
Browse files

Merge "Fix a race in SurfaceFlinger that could cause layers to be leaked forever."

parents 33e85420 dea20b1f
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -395,7 +395,7 @@ bool SurfaceFlinger::threadLoop()
    if (LIKELY(mTransactionCount == 0)) {
        // if we're in a global transaction, don't do anything.
        const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
        uint32_t transactionFlags = getTransactionFlags(mask);
        uint32_t transactionFlags = peekTransactionFlags(mask);
        if (LIKELY(transactionFlags)) {
            handleTransaction(transactionFlags);
        }
@@ -490,7 +490,17 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
        Mutex::Autolock _l(mStateLock);
        const nsecs_t now = systemTime();
        mDebugInTransaction = now;

        // Here we're guaranteed that some transaction flags are set
        // so we can call handleTransactionLocked() unconditionally.
        // We call getTransactionFlags(), which will also clear the flags,
        // with mStateLock held to guarantee that mCurrentState won't change
        // until the transaction is commited.

        const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
        transactionFlags = getTransactionFlags(mask);
        handleTransactionLocked(transactionFlags, ditchedLayers);

        mLastTransactionTime = systemTime() - now;
        mDebugInTransaction = 0;
        invalidateHwcGeometry();
@@ -1153,6 +1163,11 @@ status_t SurfaceFlinger::invalidateLayerVisibility(const sp<LayerBase>& layer)
    return NO_ERROR;
}

uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t flags)
{
    return android_atomic_release_load(&mTransactionFlags);
}

uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags)
{
    return android_atomic_and(~flags, &mTransactionFlags) & flags;
+1 −0
Original line number Diff line number Diff line
@@ -325,6 +325,7 @@ private:
            status_t    purgatorizeLayer_l(const sp<LayerBase>& layer);

            uint32_t    getTransactionFlags(uint32_t flags);
            uint32_t    peekTransactionFlags(uint32_t flags);
            uint32_t    setTransactionFlags(uint32_t flags);
            void        commitTransaction();