summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tianyu Jiang <tianyuj@google.com> 2018-11-06 12:40:33 -0800
committer Tianyu Jiang <tianyuj@google.com> 2018-11-06 15:13:06 -0800
commitca9201a94cf4921776c3b6ff6b027b03cea55552 (patch)
treeef0172fd85ac42d0badde9dcd1412cbbd3ceea70
parentc556dfeee1de47086a7404df3f0093daa86dcb1a (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.cpp7
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_++;