| 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..ea617f45438aa7a7aef56b327c76e54686d1d340 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|.
|
| @@ -286,7 +281,8 @@ bool Router::HandleMessageInternal(Message* message) {
|
| }
|
|
|
| void Router::OnConnectionError() {
|
| - DCHECK(!encountered_error_);
|
| + if (encountered_error_)
|
| + return;
|
|
|
| if (!pending_messages_.empty()) {
|
| // After all the pending messages are processed, we will check whether an
|
| @@ -296,6 +292,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();
|
| }
|
|
|