diff options
| author | 2023-11-07 18:57:47 +0000 | |
|---|---|---|
| committer | 2023-11-07 18:57:47 +0000 | |
| commit | decb398c68602663c46f5121f5bd67221fce35ee (patch) | |
| tree | a316402534e564369ecd2e2d57a545e2fbbb3764 /libs/gui/BufferQueueConsumer.cpp | |
| parent | 939c39111d0d1192f1002fc87b468a1817671dff (diff) | |
| parent | 1e7c09b67034f3ff1c263b3c0b5ff0c6d46c6e4a (diff) | |
Merge "IProducerListener: Add a listener for consumer detach" into main
Diffstat (limited to 'libs/gui/BufferQueueConsumer.cpp')
| -rw-r--r-- | libs/gui/BufferQueueConsumer.cpp | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp index 5b34ba12c8..b6a47fb4e9 100644 --- a/libs/gui/BufferQueueConsumer.cpp +++ b/libs/gui/BufferQueueConsumer.cpp @@ -318,35 +318,44 @@ status_t BufferQueueConsumer::detachBuffer(int slot) { ATRACE_CALL(); ATRACE_BUFFER_INDEX(slot); BQ_LOGV("detachBuffer: slot %d", slot); - std::lock_guard<std::mutex> lock(mCore->mMutex); + sp<IProducerListener> listener; + { + std::lock_guard<std::mutex> lock(mCore->mMutex); - if (mCore->mIsAbandoned) { - BQ_LOGE("detachBuffer: BufferQueue has been abandoned"); - return NO_INIT; - } + if (mCore->mIsAbandoned) { + BQ_LOGE("detachBuffer: BufferQueue has been abandoned"); + return NO_INIT; + } - if (mCore->mSharedBufferMode || slot == mCore->mSharedBufferSlot) { - BQ_LOGE("detachBuffer: detachBuffer not allowed in shared buffer mode"); - return BAD_VALUE; - } + if (mCore->mSharedBufferMode || slot == mCore->mSharedBufferSlot) { + BQ_LOGE("detachBuffer: detachBuffer not allowed in shared buffer mode"); + return BAD_VALUE; + } - if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS) { - BQ_LOGE("detachBuffer: slot index %d out of range [0, %d)", - slot, BufferQueueDefs::NUM_BUFFER_SLOTS); - return BAD_VALUE; - } else if (!mSlots[slot].mBufferState.isAcquired()) { - BQ_LOGE("detachBuffer: slot %d is not owned by the consumer " - "(state = %s)", slot, mSlots[slot].mBufferState.string()); - return BAD_VALUE; - } + if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS) { + BQ_LOGE("detachBuffer: slot index %d out of range [0, %d)", + slot, BufferQueueDefs::NUM_BUFFER_SLOTS); + return BAD_VALUE; + } else if (!mSlots[slot].mBufferState.isAcquired()) { + BQ_LOGE("detachBuffer: slot %d is not owned by the consumer " + "(state = %s)", slot, mSlots[slot].mBufferState.string()); + return BAD_VALUE; + } + if (mCore->mBufferReleasedCbEnabled) { + listener = mCore->mConnectedProducerListener; + } - mSlots[slot].mBufferState.detachConsumer(); - mCore->mActiveBuffers.erase(slot); - mCore->mFreeSlots.insert(slot); - mCore->clearBufferSlotLocked(slot); - mCore->mDequeueCondition.notify_all(); - VALIDATE_CONSISTENCY(); + mSlots[slot].mBufferState.detachConsumer(); + mCore->mActiveBuffers.erase(slot); + mCore->mFreeSlots.insert(slot); + mCore->clearBufferSlotLocked(slot); + mCore->mDequeueCondition.notify_all(); + VALIDATE_CONSISTENCY(); + } + if (listener) { + listener->onBufferDetached(slot); + } return NO_ERROR; } |