Index: third_party/mojo/src/mojo/public/dart/src/handle_watcher.dart |
diff --git a/third_party/mojo/src/mojo/public/dart/src/handle_watcher.dart b/third_party/mojo/src/mojo/public/dart/src/handle_watcher.dart |
index da688d46c21225fd1f1896e2ead53058fb3b7615..f69c981b4fa06314db4ad4bb75443e5f3adb86e3 100644 |
--- a/third_party/mojo/src/mojo/public/dart/src/handle_watcher.dart |
+++ b/third_party/mojo/src/mojo/public/dart/src/handle_watcher.dart |
@@ -5,15 +5,13 @@ |
part of core; |
class _MojoHandleWatcherNatives { |
- static int sendControlData( |
- int controlHandle, int mojoHandle, SendPort port, int data) |
- native "MojoHandleWatcher_SendControlData"; |
- static List recvControlData(int controlHandle) |
- native "MojoHandleWatcher_RecvControlData"; |
- static int setControlHandle(int controlHandle) |
- native "MojoHandleWatcher_SetControlHandle"; |
- static int getControlHandle() |
- native "MojoHandleWatcher_GetControlHandle"; |
+ static int sendControlData(int controlHandle, int mojoHandle, SendPort port, |
+ int data) native "MojoHandleWatcher_SendControlData"; |
+ static List recvControlData(int controlHandle) native |
+ "MojoHandleWatcher_RecvControlData"; |
+ static int setControlHandle(int controlHandle) native |
+ "MojoHandleWatcher_SetControlHandle"; |
+ static int getControlHandle() native "MojoHandleWatcher_GetControlHandle"; |
} |
// The MojoHandleWatcher sends a stream of events to application isolates that |
@@ -39,8 +37,14 @@ class MojoHandleWatcher { |
static const int SHUTDOWN = 4; |
static int _encodeCommand(int cmd, [int signals = 0]) => |
- (cmd << 2) | (signals & MojoHandleSignals.kReadWrite); |
- static int _decodeCommand(int cmd) => cmd >> 2; |
+ (cmd << 3) | (signals & MojoHandleSignals.kAll); |
+ static int _decodeCommand(int cmd) { |
+ assert(MojoHandleSignals.kAll < 1 << 3); |
+ return cmd >> 3; |
+ } |
+ static MojoHandleSignals _decodeSignals(int cmd) { |
+ return new MojoHandleSignals(cmd & MojoHandleSignals.kAll); |
+ } |
// The Mojo handle over which control messages are sent. |
int _controlHandle; |
@@ -69,18 +73,18 @@ class MojoHandleWatcher { |
// Priority queue of timers registered with the watcher. |
TimerQueue _timerQueue; |
- MojoHandleWatcher(this._controlHandle) : |
- _shutdown = false, |
- _handles = new List<int>(), |
- _ports = new List<SendPort>(), |
- _signals = new List<int>(), |
- _handleIndices = new Map<int, int>(), |
- _handleCount = 1, |
- _tempHandle = new MojoHandle(MojoHandle.INVALID), |
- _timerQueue = new TimerQueue() { |
+ MojoHandleWatcher(this._controlHandle) |
+ : _shutdown = false, |
+ _handles = new List<int>(), |
+ _ports = new List<SendPort>(), |
+ _signals = new List<int>(), |
+ _handleIndices = new Map<int, int>(), |
+ _handleCount = 1, |
+ _tempHandle = new MojoHandle(MojoHandle.INVALID), |
+ _timerQueue = new TimerQueue() { |
// Setup control handle. |
_handles.add(_controlHandle); |
- _ports.add(null); // There is no port for the control handle. |
+ _ports.add(null); // There is no port for the control handle. |
_signals.add(MojoHandleSignals.kReadable); |
_handleIndices[_controlHandle] = 0; |
} |
@@ -89,14 +93,17 @@ class MojoHandleWatcher { |
MojoHandleWatcher watcher = new MojoHandleWatcher(consumerHandle); |
while (!watcher._shutdown) { |
int deadline = watcher._processTimerDeadlines(); |
- MojoWaitManyResult mwmr = MojoHandle.waitMany( |
- watcher._handles, watcher._signals, deadline); |
+ MojoWaitManyResult mwmr = |
+ MojoHandle.waitMany(watcher._handles, watcher._signals, deadline); |
if (mwmr.result.isOk && mwmr.index == 0) { |
watcher._handleControlMessage(); |
} else if (mwmr.result.isOk && (mwmr.index > 0)) { |
int handle = watcher._handles[mwmr.index]; |
+ |
// Route event. |
- watcher._routeEvent(mwmr.index); |
+ watcher._routeEvent( |
+ mwmr.states[mwmr.index].satisfied_signals, |
+ mwmr.index); |
// Remove the handle from the list. |
watcher._removeHandle(handle); |
} else if (!mwmr.result.isDeadlineExceeded) { |
@@ -107,20 +114,8 @@ class MojoHandleWatcher { |
} |
} |
- void _routeEvent(int idx) { |
- int client_handle = _handles[idx]; |
- var signals = new MojoHandleSignals(_signals[idx]); |
- SendPort port = _ports[idx]; |
- |
- _tempHandle.h = client_handle; |
- bool readyWrite = signals.isWritable && _tempHandle.readyWrite; |
- bool readyRead = signals.isReadable && _tempHandle.readyRead; |
- _tempHandle.h = MojoHandle.INVALID; |
- |
- var event = MojoHandleSignals.NONE; |
- event += readyRead ? MojoHandleSignals.READABLE : MojoHandleSignals.NONE; |
- event += readyWrite ? MojoHandleSignals.WRITABLE : MojoHandleSignals.NONE; |
- port.send([signals.value, event.value]); |
+ void _routeEvent(int satisfiedSignals, int idx) { |
+ _ports[idx].send([_signals[idx], satisfiedSignals & _signals[idx]]); |
} |
void _handleControlMessage() { |
@@ -129,8 +124,7 @@ class MojoHandleWatcher { |
// result[1] = SendPort if any. |
// result[2] = command << 2 | WRITABLE | READABLE |
- var signals = new MojoHandleSignals( |
- result[2] & MojoHandleSignals.kReadWrite); |
+ var signals = _decodeSignals(result[2]); |
int command = _decodeCommand(result[2]); |
switch (command) { |
case ADD: |
@@ -199,7 +193,7 @@ class MojoHandleWatcher { |
} |
} |
- void _close(int mojoHandle, {bool pruning : false}) { |
+ void _close(int mojoHandle, {bool pruning: false}) { |
int idx = _handleIndices[mojoHandle]; |
if (idx == null) { |
// A client may request to close a handle that has already been closed on |
@@ -229,8 +223,9 @@ class MojoHandleWatcher { |
_timerQueue.removeCurrent(); |
now = (new DateTime.now()).millisecondsSinceEpoch; |
} |
- return _timerQueue.hasTimer ? (_timerQueue.currentTimeout - now) * 1000 |
- : MojoHandle.DEADLINE_INDEFINITE; |
+ return _timerQueue.hasTimer ? |
+ (_timerQueue.currentTimeout - now) * 1000 : |
+ MojoHandle.DEADLINE_INDEFINITE; |
} |
void _timer(SendPort port, int deadline) { |
@@ -247,7 +242,7 @@ class MojoHandleWatcher { |
} |
} else { |
_tempHandle.h = _handles[i]; |
- MojoWaitResult mwr = _tempHandle.wait(MojoHandleSignals.kReadWrite, 0); |
+ MojoWaitResult mwr = _tempHandle.wait(MojoHandleSignals.kAll, 0); |
if ((!mwr.result.isOk) && (!mwr.result.isDeadlineExceeded)) { |
closed.add(_handles[i]); |
} |
@@ -269,9 +264,8 @@ class MojoHandleWatcher { |
shutdownSendPort.send(null); |
} |
- static MojoResult _sendControlData(MojoHandle mojoHandle, |
- SendPort port, |
- int data) { |
+ static MojoResult _sendControlData(MojoHandle mojoHandle, SendPort port, |
+ int data) { |
int controlHandle = _MojoHandleWatcherNatives.getControlHandle(); |
if (controlHandle == MojoHandle.INVALID) { |
return MojoResult.FAILED_PRECONDITION; |
@@ -282,7 +276,10 @@ class MojoHandleWatcher { |
rawHandle = mojoHandle.h; |
} |
var result = _MojoHandleWatcherNatives.sendControlData( |
- controlHandle, rawHandle, port, data); |
+ controlHandle, |
+ rawHandle, |
+ port, |
+ data); |
return new MojoResult(result); |
} |
@@ -341,6 +338,8 @@ class MojoHandleWatcher { |
static MojoResult timer(Object ignored, SendPort port, int deadline) { |
// The deadline will be unwrapped before sending to the handle watcher. |
return _sendControlData( |
- new MojoHandle(deadline), port, _encodeCommand(TIMER)); |
+ new MojoHandle(deadline), |
+ port, |
+ _encodeCommand(TIMER)); |
} |
} |