| Index: mojo/edk/system/data_pipe_consumer_dispatcher.cc
|
| diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
|
| index ec8d2d855e4bbb6f62940b91f5176b99e2ab1d46..c908e3ae8bf7d4f9668d9fa3836d1e8b79f8f97b 100644
|
| --- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
|
| +++ b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
|
| @@ -124,6 +124,8 @@ MojoResult DataPipeConsumerDispatcher::ReadData(void* elements,
|
| uint32_t* num_bytes,
|
| MojoReadDataFlags flags) {
|
| base::AutoLock lock(lock_);
|
| + new_data_available_ = false;
|
| +
|
| if (!shared_ring_buffer_ || in_transit_)
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
| @@ -204,6 +206,7 @@ MojoResult DataPipeConsumerDispatcher::BeginReadData(const void** buffer,
|
| uint32_t* buffer_num_bytes,
|
| MojoReadDataFlags flags) {
|
| base::AutoLock lock(lock_);
|
| + new_data_available_ = false;
|
| if (!shared_ring_buffer_ || in_transit_)
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
| @@ -419,6 +422,7 @@ DataPipeConsumerDispatcher::Deserialize(const void* data,
|
| base::AutoLock lock(dispatcher->lock_);
|
| dispatcher->read_offset_ = state->read_offset;
|
| dispatcher->bytes_available_ = state->bytes_available;
|
| + dispatcher->new_data_available_ = state->bytes_available > 0;
|
| dispatcher->peer_closed_ = state->flags & kFlagPeerClosed;
|
| dispatcher->InitializeNoLock();
|
| dispatcher->UpdateSignalsStateNoLock();
|
| @@ -474,16 +478,25 @@ DataPipeConsumerDispatcher::GetHandleSignalsStateNoLock() const {
|
|
|
| HandleSignalsState rv;
|
| if (shared_ring_buffer_ && bytes_available_) {
|
| - if (!in_two_phase_read_)
|
| + if (!in_two_phase_read_) {
|
| rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_READABLE;
|
| + if (new_data_available_)
|
| + rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE;
|
| + }
|
| rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
|
| } else if (!peer_closed_ && shared_ring_buffer_) {
|
| rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
|
| }
|
|
|
| + if (shared_ring_buffer_) {
|
| + if (new_data_available_ || !peer_closed_)
|
| + rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE;
|
| + }
|
| +
|
| if (peer_closed_)
|
| rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
|
| rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
|
| +
|
| return rv;
|
| }
|
|
|
| @@ -563,8 +576,11 @@ void DataPipeConsumerDispatcher::UpdateSignalsStateNoLock() {
|
| } while (message);
|
| }
|
|
|
| - if (peer_closed_ != was_peer_closed ||
|
| - bytes_available_ != previous_bytes_available) {
|
| + bool has_new_data = bytes_available_ != previous_bytes_available;
|
| + if (has_new_data)
|
| + new_data_available_ = true;
|
| +
|
| + if (peer_closed_ != was_peer_closed || has_new_data) {
|
| awakable_list_.AwakeForStateChange(GetHandleSignalsStateNoLock());
|
| }
|
| }
|
|
|