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

Commit 39e9a251 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "BLASTBufferQueue: Correct deadlocks in mNextTransaction handling."

parents 31cf0a0d e4943eb6
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -180,9 +180,9 @@ void BLASTBufferQueue::transactionCallback(nsecs_t /*latchTime*/, const sp<Fence
    }
    mPendingReleaseItem.item = std::move(mSubmitted.front());
    mSubmitted.pop();
    if (mNextTransaction == nullptr) {

    processNextBufferLocked();
    }

    mCallbackCV.notify_all();
    decStrong((void*)transactionCallbackThunk);
}
@@ -201,7 +201,7 @@ void BLASTBufferQueue::processNextBufferLocked() {
    SurfaceComposerClient::Transaction localTransaction;
    bool applyTransaction = true;
    SurfaceComposerClient::Transaction* t = &localTransaction;
    if (mNextTransaction != nullptr) {
    if (mNextTransaction != nullptr && mUseNextTransaction) {
        t = mNextTransaction;
        mNextTransaction = nullptr;
        applyTransaction = false;
@@ -263,9 +263,10 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& /*item*/) {
    std::unique_lock _lock{mMutex};

    if (mNextTransaction != nullptr) {
        while (mNumFrameAvailable > 0 || mNumAcquired == MAX_ACQUIRED_BUFFERS) {
        while (mNumFrameAvailable > 0 || mNumAcquired == MAX_ACQUIRED_BUFFERS + 1) {
            mCallbackCV.wait(_lock);
        }
        mUseNextTransaction = true;
    }
    // add to shadow queue
    mNumFrameAvailable++;
@@ -274,6 +275,7 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& /*item*/) {

void BLASTBufferQueue::setNextTransaction(SurfaceComposerClient::Transaction* t) {
    std::lock_guard _lock{mMutex};
    mUseNextTransaction = false;
    mNextTransaction = t;
}

+2 −0
Original line number Diff line number Diff line
@@ -123,6 +123,8 @@ private:
    sp<BLASTBufferItemConsumer> mBufferItemConsumer;

    SurfaceComposerClient::Transaction* mNextTransaction GUARDED_BY(mMutex);

    bool mUseNextTransaction = false;
};

} // namespace android