summaryrefslogtreecommitdiffstats
path: root/mojo
diff options
context:
space:
mode:
authorviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-12 20:42:04 +0000
committerviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-12 20:42:04 +0000
commite31e8078d4824a1765d5b0e9ab58f72d15cf0de9 (patch)
tree7823fd7711acee08ab6e6de0c74a6f7f32351415 /mojo
parentb6fe0406730450f665bcd5aa891faf4a5c6c737c (diff)
downloadchromium_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.cc33
-rw-r--r--mojo/system/data_pipe.h6
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();