Index: sdk/lib/isolate/isolate.dart |
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart |
index a8063a083e695b133935d081f440d7010259e43f..4de80c7f0f6343fc56574a8fd9c5c60a6bfb48e8 100644 |
--- a/sdk/lib/isolate/isolate.dart |
+++ b/sdk/lib/isolate/isolate.dart |
@@ -36,6 +36,9 @@ class Isolate { |
* to the control port. |
*/ |
final SendPort controlPort; |
+ /** |
+ * Capability granting the ability to pause the isolate. |
+ */ |
final Capability pauseCapability; |
Isolate._fromControlPort(this.controlPort, [this.pauseCapability]); |
@@ -87,24 +90,27 @@ class Isolate { |
/** |
* Requests the isolate to pause. |
* |
+ * WARNING: This method is experimental and not handled on every platform yet. |
+ * |
* The isolate should stop handling events by pausing its event queue. |
* The request will eventually make the isolate stop doing anything. |
- * It will be handled before any other messages sent to the isolate from |
- * the current isolate, but no other guarantees are provided. |
+ * It will be handled before any other messages that are later sent to the |
+ * isolate from the current isolate, but no other guarantees are provided. |
+ * |
+ * The event loop may be paused before previously sent, but not yet exeuted, |
+ * messages have been reached. |
* |
* If [resumeCapability] is provided, it is used to identity the pause, |
* and must be used again to end the pause using [resume]. |
- * Otherwise a new capability is created and returned. |
+ * Otherwise a new resume capability is created and returned. |
* |
- * If an isolate is paused more than once using the same capabilty, |
+ * If an isolate is paused more than once using the same capability, |
* only one resume with that capability is needed to end the pause. |
* |
* If an isolate is paused using more than one capability, |
* they must all be individully ended before the isolate resumes. |
* |
* Returns the capability that must be used to resume end the pause. |
- * |
- * WARNING: This method is not handled on any platform yet. |
*/ |
Capability pause([Capability resumeCapability]) { |
if (resumeCapability == null) resumeCapability = new Capability(); |
@@ -119,13 +125,16 @@ class Isolate { |
/** |
* Resumes a paused isolate. |
* |
+ * WARNING: This method is experimental and not handled on every platform yet. |
+ * |
* Sends a message to an isolate requesting that it ends a pause |
* that was requested using the [resumeCapability]. |
* |
+ * When all active pause requests have been cancelled, the isolate |
+ * will continue handling normal messages. |
+ * |
* The capability must be one returned by a call to [pause] on this |
* isolate, otherwise the resume call does nothing. |
- * |
- * WARNING: This method is not handled on any platform yet. |
*/ |
void resume(Capability resumeCapability) { |
var message = new List(2) |
@@ -133,6 +142,46 @@ class Isolate { |
..[1] = resumeCapability; |
controlPort.send(message); |
} |
+ |
+ /** |
+ * Asks the isolate to send a message on [responsePort] when it terminates. |
+ * |
+ * WARNING: This method is experimental and not handled on every platform yet. |
+ * |
+ * The isolate will send a `null` message on [responsePort] as the last |
+ * thing before it terminates. It will run no further code after the message |
+ * has been sent. |
+ * |
+ * If the isolate is already dead, no message will be sent. |
+ * TODO(lrn): Can we do better? Can the system recognize this message and |
+ * send a reply if the receiving isolate is dead? |
+ */ |
+ void addOnExitListener(SendPort responsePort) { |
+ // TODO(lrn): Can we have an internal method that checks if the receiving |
+ // isolate of a SendPort is still alive? |
+ var message = new List(2) |
+ ..[0] = "add-ondone" |
+ ..[1] = responsePort; |
+ controlPort.send(message); |
+ } |
+ |
+ /** |
+ * Stop listening on exit messages from the isolate. |
+ * |
+ * WARNING: This method is experimental and not handled on every platform yet. |
+ * |
+ * If a call has previously been made to [addOnExitListener] with the same |
+ * send-port, this will unregister the port, and it will no longer receive |
+ * a message when the isolate terminates. |
+ * A response may still be sent until this operation is fully processed by |
+ * the isolate. |
+ */ |
+ void removeOnExitListener(SendPort responsePort) { |
+ var message = new List(2) |
+ ..[0] = "remove-ondone" |
+ ..[1] = responsePort; |
+ controlPort.send(message); |
+ } |
} |
/** |