Index: sdk/lib/_internal/lib/isolate_helper.dart |
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart |
index 9245d07bae5e092ba92b947cac2b4a7c7e35e7bf..8a19dc68f8ec115055d8fa9849269fa69506318b 100644 |
--- a/sdk/lib/_internal/lib/isolate_helper.dart |
+++ b/sdk/lib/_internal/lib/isolate_helper.dart |
@@ -280,16 +280,6 @@ class _IsolateContext implements IsolateContext { |
// Container with the "on exit" handler send-ports. |
var doneHandlers; |
- /** |
- * Queue of functions to call when the current event is complete. |
- * |
- * These events are not just put at the front of the event queue, because |
- * they represent control messages, and should be handled even if the |
- * event queue is paused. |
- */ |
- var _scheduledControlEvents; |
- bool _isExecutingEvent = false; |
- |
/** Whether errors are considered fatal. */ |
// This doesn't do anything yet. We need to be able to catch uncaught errors |
// (oxymoronically) in order to take lethal action. This is waiting for the |
@@ -342,41 +332,15 @@ class _IsolateContext implements IsolateContext { |
} |
void handlePing(SendPort responsePort, int pingType) { |
- if (pingType == Isolate.IMMEDIATE || |
- (pingType == Isolate.BEFORE_NEXT_EVENT && |
- !_isExecutingEvent)) { |
+ if (pingType == Isolate.PING_EVENT) { |
+ _globalState.topEventLoop.enqueue(this, () { |
+ responsePort.send(null); |
+ }, "ping"); |
+ } else { |
+ // There is no difference between PING_ALIVE and PING_CONTROL |
+ // since we don't handle it before the control event queue. |
responsePort.send(null); |
- return; |
- } |
- void respond() { responsePort.send(null); } |
- if (pingType == Isolate.AS_EVENT) { |
- _globalState.topEventLoop.enqueue(this, respond, "ping"); |
- return; |
- } |
- assert(pingType == Isolate.BEFORE_NEXT_EVENT); |
- if (_scheduledControlEvents == null) { |
- _scheduledControlEvents = new Queue(); |
- } |
- _scheduledControlEvents.addLast(respond); |
- } |
- |
- void handleKill(Capability authentification, int priority) { |
- if (this.terminateCapability != authentification) return; |
- if (priority == Isolate.IMMEDIATE || |
- (priority == Isolate.BEFORE_NEXT_EVENT && |
- !_isExecutingEvent)) { |
- kill(); |
- return; |
- } |
- if (priority == Isolate.AS_EVENT) { |
- _globalState.topEventLoop.enqueue(this, kill, "kill"); |
- return; |
- } |
- assert(priority == Isolate.BEFORE_NEXT_EVENT); |
- if (_scheduledControlEvents == null) { |
- _scheduledControlEvents = new Queue(); |
} |
- _scheduledControlEvents.addLast(kill); |
} |
/** |
@@ -387,18 +351,11 @@ class _IsolateContext implements IsolateContext { |
_globalState.currentContext = this; |
this._setGlobals(); |
var result = null; |
- _isExecutingEvent = true; |
try { |
result = code(); |
} finally { |
- _isExecutingEvent = false; |
_globalState.currentContext = old; |
if (old != null) old._setGlobals(); |
- if (_scheduledControlEvents != null) { |
- while (_scheduledControlEvents.isNotEmpty) { |
- (_scheduledControlEvents.removeFirst())(); |
- } |
- } |
} |
return result; |
} |
@@ -407,13 +364,6 @@ class _IsolateContext implements IsolateContext { |
JS_SET_CURRENT_ISOLATE(isolateStatics); |
} |
- /** |
- * Handle messages comming in on the control port. |
- * |
- * These events do not go through the event queue. |
- * The `_globalState.currentContext` context is not set to this context |
- * during the handling. |
- */ |
void handleControlMessage(message) { |
switch (message[0]) { |
case "pause": |
@@ -434,10 +384,8 @@ class _IsolateContext implements IsolateContext { |
case "ping": |
handlePing(message[1], message[2]); |
break; |
- case "kill": |
- handleKill(message[1], message[2]); |
- break; |
default: |
+ print("UNKNOWN MESSAGE: $message"); |
} |
} |
@@ -471,30 +419,18 @@ class _IsolateContext implements IsolateContext { |
if (ports.length - weakPorts.length > 0 || isPaused) { |
_globalState.isolates[id] = this; // indicate this isolate is active |
} else { |
- kill(); |
+ _shutdown(); |
} |
} |
- void kill() { |
- if (_scheduledControlEvents != null) { |
- // Kill all pending events. |
- _scheduledControlEvents.clear(); |
- } |
- // Stop listening on all ports. |
- // This should happen before sending events to done handlers, in case |
- // we are listening on ourselves. |
- // Closes all ports, including control port. |
- for (var port in ports.values) { |
- port._close(); |
- } |
- ports.clear(); |
- weakPorts.clear(); |
+ void _shutdown() { |
_globalState.isolates.remove(id); // indicate this isolate is not active |
+ // Send "done" event to all listeners. This must be done after deactivating |
+ // the current isolate, or it may get events if listening to itself. |
if (doneHandlers != null) { |
for (SendPort port in doneHandlers) { |
port.send(null); |
} |
- doneHandlers = null; |
} |
} |
@@ -1110,13 +1046,6 @@ class RawReceivePortImpl implements RawReceivePort { |
_handler = newHandler; |
} |
- // Close the port without unregistering it. |
- // Used by an isolate context to close all ports when shutting down. |
- void _close() { |
- _isClosed = true; |
- _handler = null; |
- } |
- |
void close() { |
if (_isClosed) return; |
_isClosed = true; |