Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1211)

Unified Diff: mojo/public/cpp/bindings/lib/router.cc

Issue 1832193002: Mojo C++ bindings: refactor SyncHandleWatcher. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698