| Index: mojo/common/message_pump_mojo.cc
|
| diff --git a/mojo/common/message_pump_mojo.cc b/mojo/common/message_pump_mojo.cc
|
| index c06927015945f36ba451498a8df9c5639a2ebd95..afbf8f983b8fb4b57de6d2982a0a59bd7d600840 100644
|
| --- a/mojo/common/message_pump_mojo.cc
|
| +++ b/mojo/common/message_pump_mojo.cc
|
| @@ -173,25 +173,29 @@ void MessagePumpMojo::DoRunLoop(RunState* run_state, Delegate* delegate) {
|
| bool MessagePumpMojo::DoInternalWork(const RunState& run_state, bool block) {
|
| const MojoDeadline deadline = block ? GetDeadlineForWait(run_state) : 0;
|
| const WaitState wait_state = GetWaitState(run_state);
|
| - const MojoResult result =
|
| - WaitMany(wait_state.handles, wait_state.wait_signals, deadline);
|
| +
|
| + const WaitManyResult wait_many_result =
|
| + WaitMany(wait_state.handles, wait_state.wait_signals, deadline, nullptr);
|
| + const MojoResult result = wait_many_result.result;
|
| bool did_work = true;
|
| - if (result == 0) {
|
| - // Control pipe was written to.
|
| - ReadMessageRaw(run_state.read_handle.get(), NULL, NULL, NULL, NULL,
|
| - MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
|
| - } else if (result > 0) {
|
| - const size_t index = static_cast<size_t>(result);
|
| - DCHECK(handlers_.find(wait_state.handles[index]) != handlers_.end());
|
| - WillSignalHandler();
|
| - handlers_[wait_state.handles[index]].handler->OnHandleReady(
|
| - wait_state.handles[index]);
|
| - DidSignalHandler();
|
| + if (result == MOJO_RESULT_OK) {
|
| + if (wait_many_result.index == 0) {
|
| + // Control pipe was written to.
|
| + ReadMessageRaw(run_state.read_handle.get(), NULL, NULL, NULL, NULL,
|
| + MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
|
| + } else {
|
| + DCHECK(handlers_.find(wait_state.handles[wait_many_result.index]) !=
|
| + handlers_.end());
|
| + WillSignalHandler();
|
| + handlers_[wait_state.handles[wait_many_result.index]]
|
| + .handler->OnHandleReady(wait_state.handles[wait_many_result.index]);
|
| + DidSignalHandler();
|
| + }
|
| } else {
|
| switch (result) {
|
| case MOJO_RESULT_CANCELLED:
|
| case MOJO_RESULT_FAILED_PRECONDITION:
|
| - RemoveFirstInvalidHandle(wait_state);
|
| + RemoveInvalidHandle(wait_state, result, wait_many_result.index);
|
| break;
|
| case MOJO_RESULT_DEADLINE_EXCEEDED:
|
| did_work = false;
|
| @@ -224,32 +228,23 @@ bool MessagePumpMojo::DoInternalWork(const RunState& run_state, bool block) {
|
| return did_work;
|
| }
|
|
|
| -void MessagePumpMojo::RemoveFirstInvalidHandle(const WaitState& wait_state) {
|
| +void MessagePumpMojo::RemoveInvalidHandle(const WaitState& wait_state,
|
| + MojoResult result,
|
| + uint32_t index) {
|
| // TODO(sky): deal with control pipe going bad.
|
| - for (size_t i = 0; i < wait_state.handles.size(); ++i) {
|
| - const MojoResult result =
|
| - Wait(wait_state.handles[i], wait_state.wait_signals[i], 0);
|
| - if (result == MOJO_RESULT_INVALID_ARGUMENT) {
|
| - // We should never have an invalid argument. If we do it indicates
|
| - // RemoveHandler() was not invoked and is likely to cause problems else
|
| - // where in the stack if we ignore it.
|
| - CHECK(false);
|
| - } else if (result == MOJO_RESULT_FAILED_PRECONDITION ||
|
| - result == MOJO_RESULT_CANCELLED) {
|
| - CHECK_NE(i, 0u); // Indicates the control pipe went bad.
|
| -
|
| - // Remove the handle first, this way if OnHandleError() tries to remove
|
| - // the handle our iterator isn't invalidated.
|
| - CHECK(handlers_.find(wait_state.handles[i]) != handlers_.end());
|
| - MessagePumpMojoHandler* handler =
|
| - handlers_[wait_state.handles[i]].handler;
|
| - handlers_.erase(wait_state.handles[i]);
|
| - WillSignalHandler();
|
| - handler->OnHandleError(wait_state.handles[i], result);
|
| - DidSignalHandler();
|
| - return;
|
| - }
|
| - }
|
| + CHECK(result == MOJO_RESULT_FAILED_PRECONDITION ||
|
| + result == MOJO_RESULT_CANCELLED);
|
| + CHECK_NE(index, 0u); // Indicates the control pipe went bad.
|
| +
|
| + // Remove the handle first, this way if OnHandleError() tries to remove the
|
| + // handle our iterator isn't invalidated.
|
| + CHECK(handlers_.find(wait_state.handles[index]) != handlers_.end());
|
| + MessagePumpMojoHandler* handler =
|
| + handlers_[wait_state.handles[index]].handler;
|
| + handlers_.erase(wait_state.handles[index]);
|
| + WillSignalHandler();
|
| + handler->OnHandleError(wait_state.handles[index], result);
|
| + DidSignalHandler();
|
| }
|
|
|
| void MessagePumpMojo::SignalControlPipe(const RunState& run_state) {
|
|
|