| Index: mojo/message_pump/message_pump_mojo.cc
|
| diff --git a/mojo/message_pump/message_pump_mojo.cc b/mojo/message_pump/message_pump_mojo.cc
|
| index 248c33a4fc7821454944e464214dbf29ec0fafc3..b068cb6af7e407eb967f683797a7ee4fd691d556 100644
|
| --- a/mojo/message_pump/message_pump_mojo.cc
|
| +++ b/mojo/message_pump/message_pump_mojo.cc
|
| @@ -168,15 +168,23 @@ bool MessagePumpMojo::DoInternalWork(const RunState& run_state, bool block) {
|
| const MojoDeadline deadline = block ? GetDeadlineForWait(run_state) : 0;
|
| const WaitState wait_state = GetWaitState();
|
|
|
| + std::vector<MojoHandleSignalsState> states(wait_state.handles.size());
|
| const WaitManyResult wait_many_result =
|
| - WaitMany(wait_state.handles, wait_state.wait_signals, deadline, nullptr);
|
| + WaitMany(wait_state.handles, wait_state.wait_signals, deadline, &states);
|
| const MojoResult result = wait_many_result.result;
|
| bool did_work = true;
|
| if (result == MOJO_RESULT_OK) {
|
| if (wait_many_result.index == 0) {
|
| - // Control pipe was written to.
|
| - ReadMessageRaw(read_handle_.get(), NULL, NULL, NULL, NULL,
|
| - MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
|
| + if (states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_PEER_CLOSED) {
|
| + // The Mojo EDK is shutting down. The ThreadQuitHelper task in
|
| + // base::Thread won't get run since the control pipe depends on the EDK
|
| + // staying alive. So quit manually to avoid this thread hanging.
|
| + Quit();
|
| + } else {
|
| + // Control pipe was written to.
|
| + ReadMessageRaw(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());
|
| @@ -245,6 +253,11 @@ void MessagePumpMojo::SignalControlPipe() {
|
| const MojoResult result =
|
| WriteMessageRaw(write_handle_.get(), NULL, 0, NULL, 0,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE);
|
| + if (result == MOJO_RESULT_FAILED_PRECONDITION) {
|
| + // Mojo EDK is shutting down.
|
| + return;
|
| + }
|
| +
|
| // If we can't write we likely won't wake up the thread and there is a strong
|
| // chance we'll deadlock.
|
| CHECK_EQ(MOJO_RESULT_OK, result);
|
| @@ -253,7 +266,8 @@ void MessagePumpMojo::SignalControlPipe() {
|
| MessagePumpMojo::WaitState MessagePumpMojo::GetWaitState() const {
|
| WaitState wait_state;
|
| wait_state.handles.push_back(read_handle_.get());
|
| - wait_state.wait_signals.push_back(MOJO_HANDLE_SIGNAL_READABLE);
|
| + wait_state.wait_signals.push_back(
|
| + MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED);
|
|
|
| for (HandleToHandler::const_iterator i = handlers_.begin();
|
| i != handlers_.end(); ++i) {
|
|
|