Chromium Code Reviews| Index: mojo/public/cpp/bindings/lib/router.cc |
| diff --git a/mojo/public/cpp/bindings/lib/router.cc b/mojo/public/cpp/bindings/lib/router.cc |
| index 045fc6203fec20204ea20ec915ee5738fc5d1954..0eea525fcfdad3216772fd052132aacccefa6502 100644 |
| --- a/mojo/public/cpp/bindings/lib/router.cc |
| +++ b/mojo/public/cpp/bindings/lib/router.cc |
| @@ -124,7 +124,7 @@ Router::Router(ScopedMessagePipeHandle message_pipe, |
| weak_factory_(this) { |
| filters_.SetSink(&thunk_); |
| if (expects_sync_requests) |
| - connector_.RegisterSyncHandleWatch(); |
| + connector_.AllowWokenUpBySyncWatchOnSameThread(); |
| connector_.set_incoming_receiver(filters_.GetHead()); |
| connector_.set_connection_error_handler([this]() { OnConnectionError(); }); |
| } |
| @@ -156,16 +156,13 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) { |
| return true; |
| } |
| - if (!connector_.RegisterSyncHandleWatch()) |
| - return false; |
| - |
| bool response_received = false; |
| scoped_ptr<MessageReceiver> sync_responder(responder); |
| sync_responses_.insert(std::make_pair( |
| request_id, make_scoped_ptr(new SyncResponseInfo(&response_received)))); |
| base::WeakPtr<Router> weak_self = weak_factory_.GetWeakPtr(); |
| - bool result = connector_.RunSyncHandleWatch(&response_received); |
| + bool result = connector_.SyncWatch(&response_received); |
| // Make sure that this instance hasn't been destroyed. |
| if (weak_self) { |
| DCHECK(ContainsKey(sync_responses_, request_id)); |
| @@ -176,8 +173,6 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) { |
| ignore_result(sync_responder->Accept(response.get())); |
| } |
| sync_responses_.erase(iter); |
| - |
| - connector_.UnregisterSyncHandleWatch(); |
| } |
| // Return true means that we take ownership of |responder|. |
| @@ -288,6 +283,9 @@ bool Router::HandleMessageInternal(Message* message) { |
| void Router::OnConnectionError() { |
| DCHECK(!encountered_error_); |
|
Ken Rockot(use gerrit already)
2016/03/26 03:09:26
If this DCHECK is appropriate then the function sh
yzshen1
2016/03/26 06:33:17
Oops! The DCHECK should be removed. Thanks!
|
| + if (encountered_error_) |
| + return; |
| + |
| if (!pending_messages_.empty()) { |
| // After all the pending messages are processed, we will check whether an |
| // error has been encountered and run the user's connection error handler |
| @@ -296,6 +294,14 @@ void Router::OnConnectionError() { |
| return; |
| } |
| + if (connector_.during_sync_handle_watcher_callback()) { |
| + // We don't want the error handler to reenter an ongoing sync call. |
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&Router::OnConnectionError, weak_factory_.GetWeakPtr())); |
| + return; |
| + } |
| + |
| encountered_error_ = true; |
| error_handler_.Run(); |
| } |