diff options
author | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-12 20:42:04 +0000 |
---|---|---|
committer | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-12 20:42:04 +0000 |
commit | e31e8078d4824a1765d5b0e9ab58f72d15cf0de9 (patch) | |
tree | 7823fd7711acee08ab6e6de0c74a6f7f32351415 /mojo | |
parent | b6fe0406730450f665bcd5aa891faf4a5c6c737c (diff) | |
download | chromium_src-e31e8078d4824a1765d5b0e9ab58f72d15cf0de9.zip chromium_src-e31e8078d4824a1765d5b0e9ab58f72d15cf0de9.tar.gz chromium_src-e31e8078d4824a1765d5b0e9ab58f72d15cf0de9.tar.bz2 |
Mojo: Plumb wait flags state through DataPipe::Awake...WaitersForStateChangeNoLock().
This reduces redundant state calculations.
R=yzshen@chromium.org
Review URL: https://codereview.chromium.org/333713003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276791 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo')
-rw-r--r-- | mojo/system/data_pipe.cc | 33 | ||||
-rw-r--r-- | mojo/system/data_pipe.h | 6 |
2 files changed, 21 insertions, 18 deletions
diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc index 2af15be..ebbb686 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 diff --git a/mojo/system/data_pipe.h b/mojo/system/data_pipe.h index a1d95ad..79d6d7a 100644 --- a/mojo/system/data_pipe.h +++ b/mojo/system/data_pipe.h @@ -165,8 +165,10 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipe : } private: - void AwakeProducerWaitersForStateChangeNoLock(); - void AwakeConsumerWaitersForStateChangeNoLock(); + void AwakeProducerWaitersForStateChangeNoLock( + const WaitFlagsState& new_producer_state); + void AwakeConsumerWaitersForStateChangeNoLock( + const WaitFlagsState& new_consumer_state); bool has_local_producer_no_lock() const { lock_.AssertAcquired(); |