Index: mojo/public/cpp/utility/lib/run_loop.cc |
diff --git a/mojo/public/cpp/utility/lib/run_loop.cc b/mojo/public/cpp/utility/lib/run_loop.cc |
index 432365f3d4cec9f76abb4759bb8a9129a0096757..7faf748f757808f0e6df9c188483073184727130 100644 |
--- a/mojo/public/cpp/utility/lib/run_loop.cc |
+++ b/mojo/public/cpp/utility/lib/run_loop.cc |
@@ -144,32 +144,40 @@ void RunLoop::PostDelayedTask(const Closure& task, MojoTimeTicks delay) { |
bool RunLoop::Wait(bool non_blocking) { |
const WaitState wait_state = GetWaitState(non_blocking); |
- if (wait_state.handles.empty() && delayed_tasks_.empty()) { |
- Quit(); |
+ if (wait_state.handles.empty()) { |
+ if (delayed_tasks_.empty()) |
+ Quit(); |
return false; |
} |
- const MojoResult result = WaitMany( |
- wait_state.handles, wait_state.handle_signals, wait_state.deadline); |
- if (result >= 0) { |
- const size_t index = static_cast<size_t>(result); |
- assert(handler_data_.find(wait_state.handles[index]) != |
- handler_data_.end()); |
- handler_data_[wait_state.handles[index]].handler->OnHandleReady( |
- wait_state.handles[index]); |
- return true; |
+ const WaitManyResult wmr = |
+ WaitMany(wait_state.handles, wait_state.handle_signals, |
+ wait_state.deadline, nullptr); |
+ |
+ if (!wmr.IsIndexValid()) { |
+ assert(wmr.result == MOJO_RESULT_DEADLINE_EXCEEDED); |
+ return NotifyHandlers(MOJO_RESULT_DEADLINE_EXCEEDED, CHECK_DEADLINE); |
} |
- switch (result) { |
+ Handle handle = wait_state.handles[wmr.index]; |
+ assert(handler_data_.find(handle) != handler_data_.end()); |
+ RunLoopHandler* handler = handler_data_[handle].handler; |
+ |
+ switch (wmr.result) { |
+ case MOJO_RESULT_OK: |
+ handler->OnHandleReady(handle); |
+ return true; |
case MOJO_RESULT_INVALID_ARGUMENT: |
case MOJO_RESULT_FAILED_PRECONDITION: |
- return RemoveFirstInvalidHandle(wait_state); |
- case MOJO_RESULT_DEADLINE_EXCEEDED: |
- return NotifyHandlers(MOJO_RESULT_DEADLINE_EXCEEDED, CHECK_DEADLINE); |
+ // Remove the handle first, this way if OnHandleError() tries to remove |
+ // the handle our iterator isn't invalidated. |
+ handler_data_.erase(handle); |
+ handler->OnHandleError(handle, wmr.result); |
+ return true; |
+ default: |
+ assert(false); |
+ return false; |
} |
- |
- assert(false); |
- return false; |
} |
bool RunLoop::NotifyHandlers(MojoResult error, CheckDeadline check) { |
@@ -204,26 +212,6 @@ bool RunLoop::NotifyHandlers(MojoResult error, CheckDeadline check) { |
return notified; |
} |
-bool RunLoop::RemoveFirstInvalidHandle(const WaitState& wait_state) { |
- for (size_t i = 0; i < wait_state.handles.size(); ++i) { |
- const MojoResult result = mojo::Wait(wait_state.handles[i], |
- wait_state.handle_signals[i], |
- static_cast<MojoDeadline>(0)); |
- if (result == MOJO_RESULT_INVALID_ARGUMENT || |
- result == MOJO_RESULT_FAILED_PRECONDITION) { |
- // Remove the handle first, this way if OnHandleError() tries to remove |
- // the handle our iterator isn't invalidated. |
- assert(handler_data_.find(wait_state.handles[i]) != handler_data_.end()); |
- RunLoopHandler* handler = handler_data_[wait_state.handles[i]].handler; |
- handler_data_.erase(wait_state.handles[i]); |
- handler->OnHandleError(wait_state.handles[i], result); |
- return true; |
- } |
- assert(MOJO_RESULT_DEADLINE_EXCEEDED == result || MOJO_RESULT_OK == result); |
- } |
- return false; |
-} |
- |
RunLoop::WaitState RunLoop::GetWaitState(bool non_blocking) const { |
WaitState wait_state; |
MojoTimeTicks min_time = kInvalidTimeTicks; |