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

Unified Diff: ipc/ipc_sync_channel.cc

Issue 2725133002: Mojo: Armed Watchers (Closed)
Patch Set: rebase Created 3 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: ipc/ipc_sync_channel.cc
diff --git a/ipc/ipc_sync_channel.cc b/ipc/ipc_sync_channel.cc
index 840c89d94871d0e80094336e03f81f2df7799dd2..6852399bdfa4d8acdaba6bd7e766e715df085947 100644
--- a/ipc/ipc_sync_channel.cc
+++ b/ipc/ipc_sync_channel.cc
@@ -41,9 +41,9 @@ void OnSyncHandleReady(bool* signal, bool* error, MojoResult result) {
*error = result != MOJO_RESULT_OK;
}
-// A ReadyCallback for use with mojo::Watcher. Ignores the result (DCHECKs, but
-// is only used in cases where failure should be impossible) and runs
-// |callback|.
+// A ReadyCallback for use with mojo::SimpleWatcher. Ignores the result
+// (DCHECKs, but is only used in cases where failure should be impossible) and
+// runs |callback|.
void RunOnHandleReady(const base::Closure& callback, MojoResult result) {
DCHECK_EQ(result, MOJO_RESULT_OK);
callback.Run();
@@ -230,11 +230,11 @@ class SyncChannel::ReceivedSyncMsgQueue :
}
}
- mojo::Watcher* top_send_done_watcher() {
+ mojo::SimpleWatcher* top_send_done_watcher() {
return top_send_done_watcher_;
}
- void set_top_send_done_watcher(mojo::Watcher* watcher) {
+ void set_top_send_done_watcher(mojo::SimpleWatcher* watcher) {
top_send_done_watcher_ = watcher;
}
@@ -300,7 +300,7 @@ class SyncChannel::ReceivedSyncMsgQueue :
// The current send done handle watcher for this thread. Used to maintain
// a thread-local stack of send done watchers to ensure that nested sync
// message loops complete correctly.
- mojo::Watcher* top_send_done_watcher_;
+ mojo::SimpleWatcher* top_send_done_watcher_;
// If not null, the address of a flag to set when the dispatch event signals,
// in lieu of actually dispatching messages. This is used by
@@ -527,7 +527,8 @@ SyncChannel::SyncChannel(
WaitableEvent* shutdown_event)
: ChannelProxy(new SyncContext(listener, ipc_task_runner, shutdown_event)),
sync_handle_registry_(mojo::SyncHandleRegistry::current()),
- dispatch_watcher_(FROM_HERE) {
+ dispatch_watcher_(FROM_HERE,
+ mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC) {
// The current (listener) thread must be distinct from the IPC thread, or else
// sending synchronous messages will deadlock.
DCHECK_NE(ipc_task_runner.get(), base::ThreadTaskRunnerHandle::Get().get());
@@ -622,7 +623,6 @@ void SyncChannel::WaitForReply(mojo::SyncHandleRegistry* registry,
context->received_sync_msgs()->UnblockDispatch();
DCHECK(!error);
-
registry->UnregisterHandle(context->GetSendDoneEvent()->GetHandle());
if (pump_messages_event)
registry->UnregisterHandle(pump_messages_event->GetHandle());
@@ -643,14 +643,15 @@ void SyncChannel::WaitForReply(mojo::SyncHandleRegistry* registry,
}
void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) {
- mojo::Watcher send_done_watcher(FROM_HERE);
+ mojo::SimpleWatcher send_done_watcher(
+ FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC);
ReceivedSyncMsgQueue* sync_msg_queue = context->received_sync_msgs();
DCHECK_NE(sync_msg_queue, nullptr);
- mojo::Watcher* old_watcher = sync_msg_queue->top_send_done_watcher();
+ mojo::SimpleWatcher* old_watcher = sync_msg_queue->top_send_done_watcher();
mojo::Handle old_handle(mojo::kInvalidHandleValue);
- mojo::Watcher::ReadyCallback old_callback;
+ mojo::SimpleWatcher::ReadyCallback old_callback;
// Maintain a thread-local stack of watchers to ensure nested calls complete
// in the correct sequence, i.e. the outermost call completes first, etc.
@@ -664,7 +665,7 @@ void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) {
{
base::RunLoop nested_loop;
- send_done_watcher.Start(
+ send_done_watcher.Watch(
context->GetSendDoneEvent()->GetHandle(), MOJO_HANDLE_SIGNAL_READABLE,
base::Bind(&RunOnHandleReady, nested_loop.QuitClosure()));
@@ -676,7 +677,7 @@ void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) {
sync_msg_queue->set_top_send_done_watcher(old_watcher);
if (old_watcher)
- old_watcher->Start(old_handle, MOJO_HANDLE_SIGNAL_READABLE, old_callback);
+ old_watcher->Watch(old_handle, MOJO_HANDLE_SIGNAL_READABLE, old_callback);
}
void SyncChannel::OnDispatchHandleReady(MojoResult result) {
@@ -690,10 +691,10 @@ void SyncChannel::StartWatching() {
// messages once the listener thread is unblocked and pumping its task queue.
// The ReceivedSyncMsgQueue also watches this event and may dispatch
// immediately if woken up by a message which it's allowed to dispatch.
- dispatch_watcher_.Start(sync_context()->GetDispatchEvent()->GetHandle(),
- MOJO_HANDLE_SIGNAL_READABLE,
- base::Bind(&SyncChannel::OnDispatchHandleReady,
- base::Unretained(this)));
+ dispatch_watcher_.Watch(
+ sync_context()->GetDispatchEvent()->GetHandle(),
+ MOJO_HANDLE_SIGNAL_READABLE,
+ base::Bind(&SyncChannel::OnDispatchHandleReady, base::Unretained(this)));
}
void SyncChannel::OnChannelInit() {

Powered by Google App Engine
This is Rietveld 408576698