diff options
| author | 2018-11-06 12:40:33 -0800 | |
|---|---|---|
| committer | 2018-11-06 15:13:06 -0800 | |
| commit | ca9201a94cf4921776c3b6ff6b027b03cea55552 (patch) | |
| tree | ef0172fd85ac42d0badde9dcd1412cbbd3ceea70 | |
| parent | c556dfeee1de47086a7404df3f0093daa86dcb1a (diff) | |
Fix race condition between ProducerQueue dequeue and ConsumerQueue dequeue newly allocated buffer.
The original check allows newly added consumer to acquire after
LocalGain but before remote gain.
Test: all tests still pass.
Bug: 119112218
Change-Id: Iea0ae431b211ce4a539e4db64ea72411028e080a
| -rw-r--r-- | services/vr/bufferhubd/producer_channel.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/services/vr/bufferhubd/producer_channel.cpp b/services/vr/bufferhubd/producer_channel.cpp index 241eee7ab9..397c0ae58e 100644 --- a/services/vr/bufferhubd/producer_channel.cpp +++ b/services/vr/bufferhubd/producer_channel.cpp @@ -311,8 +311,11 @@ Status<RemoteChannelHandle> ProducerChannel::CreateConsumer(Message& message) { return ErrorStatus(ENOMEM); } - if (!producer_owns_ && !BufferHubDefs::IsBufferReleased( - buffer_state_->load(std::memory_order_acquire))) { + uint64_t current_buffer_state = + buffer_state_->load(std::memory_order_acquire); + if (!producer_owns_ && + (BufferHubDefs::IsBufferPosted(current_buffer_state) || + BufferHubDefs::IsBufferAcquired(current_buffer_state))) { // Signal the new consumer when adding it to a posted producer. if (consumer->OnProducerPosted()) pending_consumers_++; |