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

Side by Side Diff: sdk/lib/isolate/isolate.dart

Issue 2549363003: Update documentation around Isolate capabilities. (Closed)
Patch Set: More docs Created 4 years 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * Concurrent programming using _isolates_: 6 * Concurrent programming using _isolates_:
7 * independent workers that are similar to threads 7 * independent workers that are similar to threads
8 * but don't share memory, 8 * but don't share memory,
9 * communicating only via messages. 9 * communicating only via messages.
10 * 10 *
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 * object representing the new isolate when the spawn operation succeeds. 43 * object representing the new isolate when the spawn operation succeeds.
44 * 44 *
45 * Isolates run code in its own event loop, and each event may run smaller tasks 45 * Isolates run code in its own event loop, and each event may run smaller tasks
46 * in a nested microtask queue. 46 * in a nested microtask queue.
47 * 47 *
48 * An `Isolate` object allows other isolates to control the event loop 48 * An `Isolate` object allows other isolates to control the event loop
49 * of the isolate that it represents, and to inspect the isolate, 49 * of the isolate that it represents, and to inspect the isolate,
50 * for example by pausing the isolate or by getting events when the isolate 50 * for example by pausing the isolate or by getting events when the isolate
51 * has an uncaught error. 51 * has an uncaught error.
52 * 52 *
53 * The [controlPort] gives access to controlling the isolate, and the 53 * The [controlPort] identifies and gives access to controlling the isolate,
54 * [pauseCapability] and [terminateCapability] guard access to some control 54 * and the [pauseCapability] and [terminateCapability] guard access
55 * operations. 55 * to some control operations.
56 * For example, calling [pause] on an `Isolate` object created without a
57 * [pauseCapability], has no effect.
58 *
56 * The `Isolate` object provided by a spawn operation will have the 59 * The `Isolate` object provided by a spawn operation will have the
57 * control port and capabilities needed to control the isolate. 60 * control port and capabilities needed to control the isolate.
58 * New isolates objects can be created without some of these capabilities 61 * New isolate objects can be created without some of these capabilities
59 * if necessary. 62 * if necessary, using the [Isolate.Isolate] constructor.
60 * 63 *
61 * An `Isolate` object cannot be sent over a `SendPort`, but the control port 64 * An `Isolate` object cannot be sent over a `SendPort`, but the control port
62 * and capabilities can be sent, and can be used to create a new functioning 65 * and capabilities can be sent, and can be used to create a new functioning
63 * `Isolate` object in the receiving port's isolate. 66 * `Isolate` object in the receiving port's isolate.
64 */ 67 */
65 class Isolate { 68 class Isolate {
66 /** Argument to `ping` and `kill`: Ask for immediate action. */ 69 /** Argument to `ping` and `kill`: Ask for immediate action. */
67 static const int IMMEDIATE = 0; 70 static const int IMMEDIATE = 0;
68 /** Argument to `ping` and `kill`: Ask for action before the next event. */ 71 /** Argument to `ping` and `kill`: Ask for action before the next event. */
69 static const int BEFORE_NEXT_EVENT = 1; 72 static const int BEFORE_NEXT_EVENT = 1;
70 73
71 /** 74 /**
72 * Control port used to send control messages to the isolate. 75 * Control port used to send control messages to the isolate.
73 * 76 *
74 * This class provides helper functions that sends control messages 77 * The control port identifies the isolate.
75 * to the control port.
76 * 78 *
77 * The control port identifies the isolate. 79 * An `Isolate` object allows sending control messages
80 * through the control port.
81 *
82 * Some control messages require a specific capability to be passed along
83 * with the message (see [pauseCapability] and [terminateCapaibility]),
84 * otherwise the message is ignored by the isolate.
78 */ 85 */
79 final SendPort controlPort; 86 final SendPort controlPort;
80 87
81 /** 88 /**
82 * Capability granting the ability to pause the isolate. 89 * Capability granting the ability to pause the isolate.
83 * 90 *
84 * This capability is used by [pause]. 91 * This capability is required by [pause].
85 * If the capability is not the correct pause capability of the isolate, 92 * If the capability is `null`, or if it is not the correct pause capability
86 * including if the capability is `null`, then calls to `pause` will have no 93 * of the isolate identified by [controlPort],
87 * effect. 94 * then calls to [pause] will have no effect.
88 * 95 *
89 * If the isolate is started in a paused state, use this capability as 96 * If the isolate is spawned in a paused state, use this capability as
90 * argument to [resume] to resume the isolate. 97 * argument to [resume] to resume the isolate.
91 */ 98 */
92 final Capability pauseCapability; 99 final Capability pauseCapability;
93 100
94 /** 101 /**
95 * Capability granting the ability to terminate the isolate. 102 * Capability granting the ability to terminate the isolate.
96 * 103 *
97 * This capability is used by [kill] and [setErrorsFatal]. 104 * This capability is required by [kill] and [setErrorsFatal].
98 * If the capability is not the correct termination capability of the isolate, 105 * If the capability is `null`, or if it is not the correct termination
99 * including if the capability is `null`, then calls to those methods will 106 * capability of the isolate identified by [controlPort],
100 * have no effect. 107 * then calls to those methods will have no effect.
101 */ 108 */
102 final Capability terminateCapability; 109 final Capability terminateCapability;
103 110
104 /** 111 /**
105 * Create a new [Isolate] object with a restricted set of capabilities. 112 * Create a new [Isolate] object with a restricted set of capabilities.
106 * 113 *
107 * The port should be a control port for an isolate, as taken from 114 * The port should be a control port for an isolate, as taken from
108 * another `Isolate` object. 115 * another `Isolate` object.
109 * 116 *
110 * The capabilities should be the subset of the capabilities that are 117 * The capabilities should be the subset of the capabilities that are
111 * available to the original isolate. 118 * available to the original isolate.
112 * Capabilities of an isolate are locked to that isolate, and have no effect 119 * Capabilities of an isolate are locked to that isolate, and have no effect
113 * anywhere else, so the capabilities should come from the same isolate as 120 * anywhere else, so the capabilities should come from the same isolate as
114 * the control port. 121 * the control port.
115 * 122 *
116 * If all the available capabilities are included, 123 * Can also be used to create an [Isolate] object from a control port, and
117 * there is no reason to create a new object, 124 * any available capabilities, that have been sent through a [SendPort].
118 * since the behavior is defined entirely 125 *
119 * by the control port and capabilities. 126 * Example:
127 * ```dart
128 * Isolate isolate = findSomeIsolate();
129 * Isolate restrictedIsolate = new Isolate(isolate.controlPort);
130 * untrustedCode(restrictedIsolate);
131 * ```
132 * This example creates a new `Isolate` object that cannot be used to
133 * pause or terminate the isolate. All the untrusted code can do is to
134 * inspect the isolate and see uncaught errors or when it terminates.
120 */ 135 */
121 Isolate(this.controlPort, {this.pauseCapability, 136 Isolate(this.controlPort, {this.pauseCapability,
122 this.terminateCapability}); 137 this.terminateCapability});
123 138
124 /** 139 /**
125 * Return the current [Isolate]. 140 * Return the current [Isolate].
126 * 141 *
127 * The isolate gives access to the capabilities needed to inspect, 142 * The isolate gives access to the capabilities needed to inspect,
128 * pause or kill the isolate, and allows granting these capabilities 143 * pause or kill the isolate, and allows granting these capabilities
129 * to others. 144 * to others.
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 Uri packageRoot, 313 Uri packageRoot,
299 Uri packageConfig, 314 Uri packageConfig,
300 bool automaticPackageResolution: false}); 315 bool automaticPackageResolution: false});
301 316
302 /** 317 /**
303 * Requests the isolate to pause. 318 * Requests the isolate to pause.
304 * 319 *
305 * When the isolate receives the pause command, it stops 320 * When the isolate receives the pause command, it stops
306 * processing events from the event loop queue. 321 * processing events from the event loop queue.
307 * It may still add new events to the queue in response to, e.g., timers 322 * It may still add new events to the queue in response to, e.g., timers
308 * or receive-port messages. When the isolate is resumed, it handles 323 * or receive-port messages. When the isolate is resumed,
309 * the already enqueued events. 324 * it starts handling the already enqueued events.
310 * 325 *
311 * The pause request is sent through the isolate's command port, 326 * The pause request is sent through the isolate's command port,
312 * which bypasses the receiving isolate's event loop. 327 * which bypasses the receiving isolate's event loop.
313 * The pause takes effect when it is received, pausing the event loop 328 * The pause takes effect when it is received, pausing the event loop
314 * as it is at that time. 329 * as it is at that time.
315 * 330 *
316 * If [resumeCapability] is provided, it is used to identity the pause, 331 * The [resumeCapability] is used to identity the pause,
317 * and must be used again to end the pause using [resume]. 332 * and must be used again to end the pause using [resume].
318 * Otherwise a new resume capability is created and returned. 333 * If [resumeCapability] is omitted, a new capability object is created
334 * and used instead.
319 * 335 *
320 * If an isolate is paused more than once using the same capability, 336 * If an isolate is paused more than once using the same capability,
321 * only one resume with that capability is needed to end the pause. 337 * only one resume with that capability is needed to end the pause.
322 * 338 *
323 * If an isolate is paused using more than one capability, 339 * If an isolate is paused using more than one capability,
324 * each pause must be individually ended before the isolate resumes. 340 * each pause must be individually ended before the isolate resumes.
325 * 341 *
326 * Returns the capability that must be used to end the pause. 342 * Returns the capability that must be used to end the pause.
343 * This is either [resumeCapability], or a new capability when
344 * [resumeCapability] is omitted.
345 *
346 * If [pauseCapability] is `null`, or it's not the pause capability
347 * of the isolate identified by [controlPort],
348 * the pause request is ignored by the receiving isolate.
327 */ 349 */
328 Capability pause([Capability resumeCapability]) { 350 Capability pause([Capability resumeCapability]) {
329 resumeCapability ??= new Capability(); 351 resumeCapability ??= new Capability();
330 _pause(resumeCapability); 352 _pause(resumeCapability);
331 return resumeCapability; 353 return resumeCapability;
332 } 354 }
333 355
334 /** Internal implementation of [pause]. */ 356 /** Internal implementation of [pause]. */
335 external void _pause(Capability resumeCapability); 357 external void _pause(Capability resumeCapability);
336 358
337 /** 359 /**
338 * Resumes a paused isolate. 360 * Resumes a paused isolate.
339 * 361 *
340 * Sends a message to an isolate requesting that it ends a pause 362 * Sends a message to an isolate requesting that it ends a pause
341 * that was requested using the [resumeCapability]. 363 * that was previously requested.
342 * 364 *
343 * When all active pause requests have been cancelled, the isolate 365 * When all active pause requests have been cancelled, the isolate
344 * will continue processing events and handling normal messages. 366 * will continue processing events and handling normal messages.
345 * 367 *
346 * The capability must be one returned by a call to [pause] on this 368 * If the [resumeCapability] is not one that has previously been used
347 * isolate, otherwise the resume call does nothing. 369 * to pause the isolate, or it has already been used to resume from
370 * that pause, the resume call has no effect.
348 */ 371 */
349 external void resume(Capability resumeCapability); 372 external void resume(Capability resumeCapability);
350 373
351 /** 374 /**
352 * Asks the isolate to send [response] on [responsePort] when it terminates. 375 * Asks the isolate to send [response] on [responsePort] when it terminates.
353 * 376 *
354 * The isolate will send a `response` message on `responsePort` as the last 377 * The isolate will send a `response` message on `responsePort` as the last
355 * thing before it terminates. It will run no further code after the message 378 * thing before it terminates. It will run no further code after the message
356 * has been sent. 379 * has been sent.
357 * 380 *
(...skipping 28 matching lines...) Expand all
386 */ 409 */
387 external void removeOnExitListener(SendPort responsePort); 410 external void removeOnExitListener(SendPort responsePort);
388 411
389 /** 412 /**
390 * Set whether uncaught errors will terminate the isolate. 413 * Set whether uncaught errors will terminate the isolate.
391 * 414 *
392 * If errors are fatal, any uncaught error will terminate the isolate 415 * If errors are fatal, any uncaught error will terminate the isolate
393 * event loop and shut down the isolate. 416 * event loop and shut down the isolate.
394 * 417 *
395 * This call requires the [terminateCapability] for the isolate. 418 * This call requires the [terminateCapability] for the isolate.
396 * If the capability is not correct, no change is made. 419 * If the capability absent or wrong, no change is made.
397 * 420 *
398 * Since isolates run concurrently, it's possible for it to exit due to an 421 * Since isolates run concurrently, it's possible for it to exit due to an
399 * error before errors are set non-fatal. 422 * error before errors are set non-fatal.
400 * To avoid this, either use the corresponding parameter to the spawn 423 * To avoid this, either use the corresponding parameter to the spawn
401 * function, or start the isolate paused, set errors non-fatal and 424 * function, or start the isolate paused, set errors non-fatal and
402 * then resume the isolate. 425 * then resume the isolate.
403 */ 426 */
404 external void setErrorsFatal(bool errorsAreFatal); 427 external void setErrorsFatal(bool errorsAreFatal);
405 428
406 /** 429 /**
407 * Requests the isolate to shut down. 430 * Requests the isolate to shut down.
408 * 431 *
409 * The isolate is requested to terminate itself. 432 * The isolate is requested to terminate itself.
410 * The [priority] argument specifies when this must happen. 433 * The [priority] argument specifies when this must happen.
411 * 434 *
412 * The [priority] must be one of [IMMEDIATE] or [BEFORE_NEXT_EVENT]. 435 * The [priority] must be one of [IMMEDIATE] or [BEFORE_NEXT_EVENT].
413 * The shutdown is performed at different times depending on the priority: 436 * The shutdown is performed at different times depending on the priority:
414 * 437 *
415 * * `IMMEDIATE`: The isolate shuts down as soon as possible. 438 * * `IMMEDIATE`: The isolate shuts down as soon as possible.
416 * Control messages are handled in order, so all previously sent control 439 * Control messages are handled in order, so all previously sent control
417 * events from this isolate will all have been processed. 440 * events from this isolate will all have been processed.
418 * The shutdown should happen no later than if sent with 441 * The shutdown should happen no later than if sent with
419 * `BEFORE_NEXT_EVENT`. 442 * `BEFORE_NEXT_EVENT`.
420 * It may happen earlier if the system has a way to shut down cleanly 443 * It may happen earlier if the system has a way to shut down cleanly
421 * at an earlier time, even during the execution of another event. 444 * at an earlier time, even during the execution of another event.
422 * * `BEFORE_NEXT_EVENT`: The shutdown is scheduled for the next time 445 * * `BEFORE_NEXT_EVENT`: The shutdown is scheduled for the next time
423 * control returns to the event loop of the receiving isolate, 446 * control returns to the event loop of the receiving isolate,
424 * after the current event, and any already scheduled control events, 447 * after the current event, and any already scheduled control events,
425 * are completed. 448 * are completed.
449 *
450 * If [terminateCapability] is `null`, or it's not the terminate capability
451 * of the isolate identified by [controlPort],
452 * the kill request is ignored by the receiving isolate.
426 */ 453 */
427 external void kill({int priority: BEFORE_NEXT_EVENT}); 454 external void kill({int priority: BEFORE_NEXT_EVENT});
428 455
429 /** 456 /**
430 * Request that the isolate send [response] on the [responsePort]. 457 * Request that the isolate send [response] on the [responsePort].
431 * 458 *
432 * If the isolate is alive, it will eventually send `response` 459 * If the isolate is alive, it will eventually send `response`
433 * (defaulting to `null`) on the response port. 460 * (defaulting to `null`) on the response port.
434 * 461 *
435 * The [priority] must be one of [IMMEDIATE] or [BEFORE_NEXT_EVENT]. 462 * The [priority] must be one of [IMMEDIATE] or [BEFORE_NEXT_EVENT].
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 * as the original error, but has no other features of the original error. 697 * as the original error, but has no other features of the original error.
671 */ 698 */
672 class RemoteError implements Error { 699 class RemoteError implements Error {
673 final String _description; 700 final String _description;
674 final StackTrace stackTrace; 701 final StackTrace stackTrace;
675 RemoteError(String description, String stackDescription) 702 RemoteError(String description, String stackDescription)
676 : _description = description, 703 : _description = description,
677 stackTrace = new StackTrace.fromString(stackDescription); 704 stackTrace = new StackTrace.fromString(stackDescription);
678 String toString() => _description; 705 String toString() => _description;
679 } 706 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698