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

Unified Diff: mojo/edk/system/message_pipe_dispatcher.cc

Issue 2725133002: Mojo: Armed Watchers (Closed)
Patch Set: . Created 3 years, 10 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/edk/system/message_pipe_dispatcher.cc
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
index f27336b56f4d074a0e5e32ec2a592fcccff363a3..a9ae683d9bad683e56e60217ef57d5e26fdb80bb 100644
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ b/mojo/edk/system/message_pipe_dispatcher.cc
@@ -183,6 +183,7 @@ bool MessagePipeDispatcher::Fuse(MessagePipeDispatcher* other) {
port0 = port_;
port_closed_.Set(true);
awakables_.CancelAll();
+ watchers_.NotifyClosed();
}
ports::PortRef port1;
@@ -191,6 +192,7 @@ bool MessagePipeDispatcher::Fuse(MessagePipeDispatcher* other) {
port1 = other->port_;
other->port_closed_.Set(true);
other->awakables_.CancelAll();
+ other->watchers_.NotifyClosed();
}
// Both ports are always closed by this call.
@@ -209,25 +211,35 @@ MojoResult MessagePipeDispatcher::Close() {
return CloseNoLock();
}
-MojoResult MessagePipeDispatcher::Watch(MojoHandleSignals signals,
- const Watcher::WatchCallback& callback,
- uintptr_t context) {
+MojoResult MessagePipeDispatcher::RegisterWatcher(
+ MojoHandleSignals signals,
+ const Watcher::WatchCallback& callback,
+ uintptr_t context) {
+ base::AutoLock lock(signal_lock_);
+
+ if (port_closed_ || in_transit_)
+ return MOJO_RESULT_INVALID_ARGUMENT;
+
+ return watchers_.Add(signals, callback, context,
+ GetHandleSignalsStateNoLock());
+}
+
+MojoResult MessagePipeDispatcher::ArmWatcher(uintptr_t context) {
base::AutoLock lock(signal_lock_);
if (port_closed_ || in_transit_)
return MOJO_RESULT_INVALID_ARGUMENT;
- return awakables_.AddWatcher(
- signals, callback, context, GetHandleSignalsStateNoLock());
+ return watchers_.Arm(context, GetHandleSignalsStateNoLock());
}
-MojoResult MessagePipeDispatcher::CancelWatch(uintptr_t context) {
+MojoResult MessagePipeDispatcher::UnregisterWatcher(uintptr_t context) {
base::AutoLock lock(signal_lock_);
if (port_closed_ || in_transit_)
return MOJO_RESULT_INVALID_ARGUMENT;
- return awakables_.RemoveWatcher(context);
+ return watchers_.Remove(context);
}
MojoResult MessagePipeDispatcher::WriteMessage(
@@ -286,6 +298,11 @@ MojoResult MessagePipeDispatcher::ReadMessage(
&no_space, &invalid_message);
int rv = node_controller_->node()->GetMessage(port_, &ports_message, &filter);
+ {
+ base::AutoLock lock(signal_lock_);
+ watchers_.NotifyState(GetHandleSignalsStateNoLock());
+ }
+
if (invalid_message)
return MOJO_RESULT_UNKNOWN;
@@ -496,7 +513,9 @@ void MessagePipeDispatcher::CancelTransit() {
in_transit_.Set(false);
// Something may have happened while we were waiting for potential transit.
- awakables_.AwakeForStateChange(GetHandleSignalsStateNoLock());
+ HandleSignalsState state = GetHandleSignalsStateNoLock();
+ awakables_.AwakeForStateChange(state);
+ watchers_.NotifyState(state);
}
// static
@@ -532,6 +551,7 @@ MojoResult MessagePipeDispatcher::CloseNoLock() {
port_closed_.Set(true);
awakables_.CancelAll();
+ watchers_.NotifyClosed();
if (!port_transferred_) {
base::AutoUnlock unlock(signal_lock_);
@@ -596,7 +616,9 @@ void MessagePipeDispatcher::OnPortStatusChanged() {
}
#endif
- awakables_.AwakeForStateChange(GetHandleSignalsStateNoLock());
+ HandleSignalsState state = GetHandleSignalsStateNoLock();
+ awakables_.AwakeForStateChange(state);
+ watchers_.NotifyState(state);
}
} // namespace edk

Powered by Google App Engine
This is Rietveld 408576698