Index: sdk/lib/isolate/isolate.dart |
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart |
index 77b40c07a13e4e3c39159738e7d713a548ea8f03..424742a15b1d47dbc07d9d6df02f2e9de88d0807 100644 |
--- a/sdk/lib/isolate/isolate.dart |
+++ b/sdk/lib/isolate/isolate.dart |
@@ -50,13 +50,16 @@ class IsolateSpawnException implements Exception { |
* for example by pausing the isolate or by getting events when the isolate |
* has an uncaught error. |
* |
- * The [controlPort] gives access to controlling the isolate, and the |
- * [pauseCapability] and [terminateCapability] guard access to some control |
- * operations. |
+ * The [controlPort] identifies and gives access to controlling the isolate, |
+ * and the [pauseCapability] and [terminateCapability] guard access |
+ * to some control operations. |
+ * For example, calling [pause] on an `Isolate` object created without a |
+ * [pauseCapability], has no effect. |
+ * |
* The `Isolate` object provided by a spawn operation will have the |
* control port and capabilities needed to control the isolate. |
- * New isolates objects can be created without some of these capabilities |
- * if necessary. |
+ * New isolate objects can be created without some of these capabilities |
+ * if necessary, using the [Isolate.Isolate] constructor. |
* |
* An `Isolate` object cannot be sent over a `SendPort`, but the control port |
* and capabilities can be sent, and can be used to create a new functioning |
@@ -71,22 +74,26 @@ class Isolate { |
/** |
* Control port used to send control messages to the isolate. |
* |
- * This class provides helper functions that sends control messages |
- * to the control port. |
- * |
* The control port identifies the isolate. |
+ * |
+ * An `Isolate` object allows sending control messages |
+ * through the control port. |
+ * |
+ * Some control messages require a specific capability to be passed along |
+ * with the message (see [pauseCapability] and [terminateCapaibility]), |
+ * otherwise the message is ignored by the isolate. |
*/ |
final SendPort controlPort; |
/** |
* Capability granting the ability to pause the isolate. |
* |
- * This capability is used by [pause]. |
- * If the capability is not the correct pause capability of the isolate, |
- * including if the capability is `null`, then calls to `pause` will have no |
- * effect. |
+ * This capability is required by [pause]. |
+ * If the capability is `null`, or if it is not the correct pause capability |
+ * of the isolate identified by [controlPort], |
+ * then calls to [pause] will have no effect. |
* |
- * If the isolate is started in a paused state, use this capability as |
+ * If the isolate is spawned in a paused state, use this capability as |
* argument to [resume] to resume the isolate. |
*/ |
final Capability pauseCapability; |
@@ -94,10 +101,10 @@ class Isolate { |
/** |
* Capability granting the ability to terminate the isolate. |
* |
- * This capability is used by [kill] and [setErrorsFatal]. |
- * If the capability is not the correct termination capability of the isolate, |
- * including if the capability is `null`, then calls to those methods will |
- * have no effect. |
+ * This capability is required by [kill] and [setErrorsFatal]. |
+ * If the capability is `null`, or if it is not the correct termination |
+ * capability of the isolate identified by [controlPort], |
+ * then calls to those methods will have no effect. |
*/ |
final Capability terminateCapability; |
@@ -113,10 +120,18 @@ class Isolate { |
* anywhere else, so the capabilities should come from the same isolate as |
* the control port. |
* |
- * If all the available capabilities are included, |
- * there is no reason to create a new object, |
- * since the behavior is defined entirely |
- * by the control port and capabilities. |
+ * Can also be used to create an [Isolate] object from a control port, and |
+ * any available capabilities, that have been sent through a [SendPort]. |
+ * |
+ * Example: |
+ * ```dart |
+ * Isolate isolate = findSomeIsolate(); |
+ * Isolate restrictedIsolate = new Isolate(isolate.controlPort); |
+ * untrustedCode(restrictedIsolate); |
+ * ``` |
+ * This example creates a new `Isolate` object that cannot be used to |
+ * pause or terminate the isolate. All the untrusted code can do is to |
+ * inspect the isolate and see uncaught errors or when it terminates. |
*/ |
Isolate(this.controlPort, {this.pauseCapability, |
this.terminateCapability}); |
@@ -305,17 +320,18 @@ class Isolate { |
* When the isolate receives the pause command, it stops |
* processing events from the event loop queue. |
* It may still add new events to the queue in response to, e.g., timers |
- * or receive-port messages. When the isolate is resumed, it handles |
- * the already enqueued events. |
+ * or receive-port messages. When the isolate is resumed, |
+ * it starts handling the already enqueued events. |
* |
* The pause request is sent through the isolate's command port, |
* which bypasses the receiving isolate's event loop. |
* The pause takes effect when it is received, pausing the event loop |
* as it is at that time. |
* |
- * If [resumeCapability] is provided, it is used to identity the pause, |
+ * The [resumeCapability] is used to identity the pause, |
* and must be used again to end the pause using [resume]. |
- * Otherwise a new resume capability is created and returned. |
+ * If [resumeCapability] is omitted, a new capability object is created |
+ * and used instead. |
* |
* If an isolate is paused more than once using the same capability, |
* only one resume with that capability is needed to end the pause. |
@@ -324,6 +340,12 @@ class Isolate { |
* each pause must be individually ended before the isolate resumes. |
* |
* Returns the capability that must be used to end the pause. |
+ * This is either [resumeCapability], or a new capability when |
+ * [resumeCapability] is omitted. |
+ * |
+ * If [pauseCapability] is `null`, or it's not the pause capability |
+ * of the isolate identified by [controlPort], |
+ * the pause request is ignored by the receiving isolate. |
*/ |
Capability pause([Capability resumeCapability]) { |
resumeCapability ??= new Capability(); |
@@ -338,13 +360,14 @@ class Isolate { |
* Resumes a paused isolate. |
* |
* Sends a message to an isolate requesting that it ends a pause |
- * that was requested using the [resumeCapability]. |
+ * that was previously requested. |
* |
* When all active pause requests have been cancelled, the isolate |
* will continue processing events and handling normal messages. |
* |
- * The capability must be one returned by a call to [pause] on this |
- * isolate, otherwise the resume call does nothing. |
+ * If the [resumeCapability] is not one that has previously been used |
+ * to pause the isolate, or it has already been used to resume from |
+ * that pause, the resume call has no effect. |
*/ |
external void resume(Capability resumeCapability); |
@@ -393,7 +416,7 @@ class Isolate { |
* event loop and shut down the isolate. |
* |
* This call requires the [terminateCapability] for the isolate. |
- * If the capability is not correct, no change is made. |
+ * If the capability absent or wrong, no change is made. |
* |
* Since isolates run concurrently, it's possible for it to exit due to an |
* error before errors are set non-fatal. |
@@ -423,6 +446,10 @@ class Isolate { |
* control returns to the event loop of the receiving isolate, |
* after the current event, and any already scheduled control events, |
* are completed. |
+ * |
+ * If [terminateCapability] is `null`, or it's not the terminate capability |
+ * of the isolate identified by [controlPort], |
+ * the kill request is ignored by the receiving isolate. |
*/ |
external void kill({int priority: BEFORE_NEXT_EVENT}); |