Index: mojo/system/data_pipe.cc |
diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc |
index 2af15beb86213fb86d605a4caa8d0827e29e30b3..ebbb686c4799036ca342c72b0acae998dfee6998 100644 |
--- a/mojo/system/data_pipe.cc |
+++ b/mojo/system/data_pipe.cc |
@@ -90,7 +90,7 @@ void DataPipe::ProducerClose() { |
<< "Producer closed with active two-phase write"; |
producer_two_phase_max_num_bytes_written_ = 0; |
ProducerCloseImplNoLock(); |
- AwakeConsumerWaitersForStateChangeNoLock(); |
+ AwakeConsumerWaitersForStateChangeNoLock(ConsumerGetWaitFlagsStateNoLock()); |
} |
MojoResult DataPipe::ProducerWriteData(const void* elements, |
@@ -115,7 +115,7 @@ MojoResult DataPipe::ProducerWriteData(const void* elements, |
MojoResult rv = ProducerWriteDataImplNoLock(elements, num_bytes, all_or_none); |
WaitFlagsState new_consumer_state = ConsumerGetWaitFlagsStateNoLock(); |
if (!new_consumer_state.equals(old_consumer_state)) |
- AwakeConsumerWaitersForStateChangeNoLock(); |
+ AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state); |
return rv; |
} |
@@ -167,11 +167,12 @@ MojoResult DataPipe::ProducerEndWriteData(uint32_t num_bytes_written) { |
DCHECK(!producer_in_two_phase_write_no_lock()); |
// If we're now writable, we *became* writable (since we weren't writable |
// during the two-phase write), so awake producer waiters. |
- if (ProducerGetWaitFlagsStateNoLock().satisfies(MOJO_WAIT_FLAG_WRITABLE)) |
- AwakeProducerWaitersForStateChangeNoLock(); |
+ WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); |
+ if (new_producer_state.satisfies(MOJO_WAIT_FLAG_WRITABLE)) |
+ AwakeProducerWaitersForStateChangeNoLock(new_producer_state); |
WaitFlagsState new_consumer_state = ConsumerGetWaitFlagsStateNoLock(); |
if (!new_consumer_state.equals(old_consumer_state)) |
- AwakeConsumerWaitersForStateChangeNoLock(); |
+ AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state); |
return rv; |
} |
@@ -219,7 +220,7 @@ void DataPipe::ConsumerClose() { |
<< "Consumer closed with active two-phase read"; |
consumer_two_phase_max_num_bytes_read_ = 0; |
ConsumerCloseImplNoLock(); |
- AwakeProducerWaitersForStateChangeNoLock(); |
+ AwakeProducerWaitersForStateChangeNoLock(ProducerGetWaitFlagsStateNoLock()); |
} |
MojoResult DataPipe::ConsumerReadData(void* elements, |
@@ -241,7 +242,7 @@ MojoResult DataPipe::ConsumerReadData(void* elements, |
MojoResult rv = ConsumerReadDataImplNoLock(elements, num_bytes, all_or_none); |
WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); |
if (!new_producer_state.equals(old_producer_state)) |
- AwakeProducerWaitersForStateChangeNoLock(); |
+ AwakeProducerWaitersForStateChangeNoLock(new_producer_state); |
return rv; |
} |
@@ -263,7 +264,7 @@ MojoResult DataPipe::ConsumerDiscardData(uint32_t* num_bytes, |
MojoResult rv = ConsumerDiscardDataImplNoLock(num_bytes, all_or_none); |
WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); |
if (!new_producer_state.equals(old_producer_state)) |
- AwakeProducerWaitersForStateChangeNoLock(); |
+ AwakeProducerWaitersForStateChangeNoLock(new_producer_state); |
return rv; |
} |
@@ -320,10 +321,10 @@ MojoResult DataPipe::ConsumerEndReadData(uint32_t num_bytes_read) { |
// during the two-phase read), so awake consumer waiters. |
WaitFlagsState new_consumer_state = ConsumerGetWaitFlagsStateNoLock(); |
if (new_consumer_state.satisfies(MOJO_WAIT_FLAG_READABLE)) |
- AwakeConsumerWaitersForStateChangeNoLock(); |
+ AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state); |
WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); |
if (!new_producer_state.equals(old_producer_state)) |
- AwakeProducerWaitersForStateChangeNoLock(); |
+ AwakeProducerWaitersForStateChangeNoLock(new_producer_state); |
return rv; |
} |
@@ -380,20 +381,20 @@ DataPipe::~DataPipe() { |
DCHECK(!consumer_waiter_list_); |
} |
-void DataPipe::AwakeProducerWaitersForStateChangeNoLock() { |
+void DataPipe::AwakeProducerWaitersForStateChangeNoLock( |
+ const WaitFlagsState& new_producer_state) { |
lock_.AssertAcquired(); |
if (!has_local_producer_no_lock()) |
return; |
- producer_waiter_list_->AwakeWaitersForStateChange( |
- ProducerGetWaitFlagsStateNoLock()); |
+ producer_waiter_list_->AwakeWaitersForStateChange(new_producer_state); |
} |
-void DataPipe::AwakeConsumerWaitersForStateChangeNoLock() { |
+void DataPipe::AwakeConsumerWaitersForStateChangeNoLock( |
+ const WaitFlagsState& new_consumer_state) { |
lock_.AssertAcquired(); |
if (!has_local_consumer_no_lock()) |
return; |
- consumer_waiter_list_->AwakeWaitersForStateChange( |
- ConsumerGetWaitFlagsStateNoLock()); |
+ consumer_waiter_list_->AwakeWaitersForStateChange(new_consumer_state); |
} |
} // namespace system |