| OLD | NEW |
| 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 * | 56 * |
| 57 * An `Isolate` object cannot be sent over a `SendPort`, but the control port | 57 * An `Isolate` object cannot be sent over a `SendPort`, but the control port |
| 58 * and capabilities can be sent, and can be used to create a new functioning | 58 * and capabilities can be sent, and can be used to create a new functioning |
| 59 * `Isolate` object in the receiving port's isolate. | 59 * `Isolate` object in the receiving port's isolate. |
| 60 */ | 60 */ |
| 61 class Isolate { | 61 class Isolate { |
| 62 /** Argument to `ping` and `kill`: Ask for immediate action. */ | 62 /** Argument to `ping` and `kill`: Ask for immediate action. */ |
| 63 static const int IMMEDIATE = 0; | 63 static const int IMMEDIATE = 0; |
| 64 /** Argument to `ping` and `kill`: Ask for action before the next event. */ | 64 /** Argument to `ping` and `kill`: Ask for action before the next event. */ |
| 65 static const int BEFORE_NEXT_EVENT = 1; | 65 static const int BEFORE_NEXT_EVENT = 1; |
| 66 /** Argument to `ping` and `kill`: Ask for action after normal events. */ | |
| 67 static const int AS_EVENT = 2; | |
| 68 | 66 |
| 69 /** | 67 /** |
| 70 * Control port used to send control messages to the isolate. | 68 * Control port used to send control messages to the isolate. |
| 71 * | 69 * |
| 72 * This class provides helper functions that sends control messages | 70 * This class provides helper functions that sends control messages |
| 73 * to the control port. | 71 * to the control port. |
| 74 * | 72 * |
| 75 * The control port identifies the isolate. | 73 * The control port identifies the isolate. |
| 76 */ | 74 */ |
| 77 final SendPort controlPort; | 75 final SendPort controlPort; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 * | 250 * |
| 253 * When all active pause requests have been cancelled, the isolate | 251 * When all active pause requests have been cancelled, the isolate |
| 254 * will continue handling normal messages. | 252 * will continue handling normal messages. |
| 255 * | 253 * |
| 256 * The capability must be one returned by a call to [pause] on this | 254 * The capability must be one returned by a call to [pause] on this |
| 257 * isolate, otherwise the resume call does nothing. | 255 * isolate, otherwise the resume call does nothing. |
| 258 */ | 256 */ |
| 259 external void resume(Capability resumeCapability); | 257 external void resume(Capability resumeCapability); |
| 260 | 258 |
| 261 /** | 259 /** |
| 262 * Asks the isolate to send a message on [responsePort] when it terminates. | 260 * Asks the isolate to send [response] on [responsePort] when it terminates. |
| 263 * | 261 * |
| 264 * WARNING: This method is experimental and not handled on every platform yet. | 262 * WARNING: This method is experimental and not handled on every platform yet. |
| 265 * | 263 * |
| 266 * The isolate will send a `null` message on [responsePort] as the last | 264 * The isolate will send a `response` message on `responsePort` as the last |
| 267 * thing before it terminates. It will run no further code after the message | 265 * thing before it terminates. It will run no further code after the message |
| 268 * has been sent. | 266 * has been sent. |
| 269 * | 267 * |
| 268 * Adding the same port more than once will only cause it to receive one |
| 269 * message, using the last response value that was added. |
| 270 * |
| 270 * If the isolate is already dead, no message will be sent. | 271 * If the isolate is already dead, no message will be sent. |
| 272 * If `response` cannot be sent to the isolate, then the request is ignored. |
| 273 * It is recommended to only use simple values that can be sent to all |
| 274 * isolates, like `null`, booleans, numbers or strings. |
| 271 */ | 275 */ |
| 272 /* TODO(lrn): Can we do better? Can the system recognize this message and | 276 /* TODO(lrn): Can we do better? Can the system recognize this message and |
| 273 * send a reply if the receiving isolate is dead? | 277 * send a reply if the receiving isolate is dead? |
| 274 */ | 278 */ |
| 275 external void addOnExitListener(SendPort responsePort); | 279 external void addOnExitListener(SendPort responsePort, {Object response}); |
| 276 | 280 |
| 277 /** | 281 /** |
| 278 * Stop listening on exit messages from the isolate. | 282 * Stop listening on exit messages from the isolate. |
| 279 * | 283 * |
| 280 * WARNING: This method is experimental and not handled on every platform yet. | 284 * WARNING: This method is experimental and not handled on every platform yet. |
| 281 * | 285 * |
| 282 * If a call has previously been made to [addOnExitListener] with the same | 286 * If a call has previously been made to [addOnExitListener] with the same |
| 283 * send-port, this will unregister the port, and it will no longer receive | 287 * send-port, this will unregister the port, and it will no longer receive |
| 284 * a message when the isolate terminates. | 288 * a message when the isolate terminates. |
| 285 * A response may still be sent until this operation is fully processed by | 289 * A response may still be sent until this operation is fully processed by |
| (...skipping 15 matching lines...) Expand all Loading... |
| 301 external void setErrorsFatal(bool errorsAreFatal); | 305 external void setErrorsFatal(bool errorsAreFatal); |
| 302 | 306 |
| 303 /** | 307 /** |
| 304 * Requests the isolate to shut down. | 308 * Requests the isolate to shut down. |
| 305 * | 309 * |
| 306 * WARNING: This method is experimental and not handled on every platform yet. | 310 * WARNING: This method is experimental and not handled on every platform yet. |
| 307 * | 311 * |
| 308 * The isolate is requested to terminate itself. | 312 * The isolate is requested to terminate itself. |
| 309 * The [priority] argument specifies when this must happen. | 313 * The [priority] argument specifies when this must happen. |
| 310 * | 314 * |
| 311 * The [priority] must be one of [IMMEDIATE], [BEFORE_NEXT_EVENT] or | 315 * The [priority] must be one of [IMMEDIATE] or [BEFORE_NEXT_EVENT]. |
| 312 * [AS_EVENT]. | |
| 313 * The shutdown is performed at different times depending on the priority: | 316 * The shutdown is performed at different times depending on the priority: |
| 314 * | 317 * |
| 315 * * `IMMEDIATE`: The the isolate shuts down as soon as possible. | 318 * * `IMMEDIATE`: The the isolate shuts down as soon as possible. |
| 316 * Control messages are handled in order, so all previously sent control | 319 * Control messages are handled in order, so all previously sent control |
| 317 * events from this isolate will all have been processed. | 320 * events from this isolate will all have been processed. |
| 318 * The shutdown should happen no later than if sent with | 321 * The shutdown should happen no later than if sent with |
| 319 * `BEFORE_NEXT_EVENT`. | 322 * `BEFORE_NEXT_EVENT`. |
| 320 * It may happen earlier if the system has a way to shut down cleanly | 323 * It may happen earlier if the system has a way to shut down cleanly |
| 321 * at an earlier time, even during the execution of another event. | 324 * at an earlier time, even during the execution of another event. |
| 322 * * `BEFORE_NEXT_EVENT`: The shutdown is scheduled for the next time | 325 * * `BEFORE_NEXT_EVENT`: The shutdown is scheduled for the next time |
| 323 * control returns to the event loop of the receiving isolate, | 326 * control returns to the event loop of the receiving isolate, |
| 324 * after the current event, and any already scheduled control events, | 327 * after the current event, and any already scheduled control events, |
| 325 * are completed. | 328 * are completed. |
| 326 * * `AS_EVENT`: The shutdown does not happen until all prevously sent | |
| 327 * non-control messages from the current isolate to the receiving isolate | |
| 328 * have been processed. | |
| 329 * The kill operation effectively puts the shutdown into the normal event | |
| 330 * queue after previously sent messages, and it is affected by any control | |
| 331 * messages that affect normal events, including `pause`. | |
| 332 * This can be used to wait for a another event to be processed. | |
| 333 */ | 329 */ |
| 334 external void kill([int priority = BEFORE_NEXT_EVENT]); | 330 external void kill({int priority: BEFORE_NEXT_EVENT}); |
| 335 | 331 |
| 336 /** | 332 /** |
| 337 * Request that the isolate send a response on the [responsePort]. | 333 * Request that the isolate send [response] on the [responsePort]. |
| 338 * | 334 * |
| 339 * WARNING: This method is experimental and not handled on every platform yet. | 335 * WARNING: This method is experimental and not handled on every platform yet. |
| 340 * | 336 * |
| 341 * If the isolate is alive, it will eventually send a `null` response on | 337 * If the isolate is alive, it will eventually send `response` |
| 342 * the response port. | 338 * (defaulting to `null`) on the response port. |
| 343 * | 339 * |
| 344 * The [pingType] must be one of [IMMEDIATE], [BEFORE_NEXT_EVENT] or | 340 * The [priority] must be one of [IMMEDIATE] or [BEFORE_NEXT_EVENT]. |
| 345 * [AS_EVENT]. | |
| 346 * The response is sent at different times depending on the ping type: | 341 * The response is sent at different times depending on the ping type: |
| 347 * | 342 * |
| 348 * * `IMMEDIATE`: The the isolate responds as soon as it receives the | 343 * * `IMMEDIATE`: The the isolate responds as soon as it receives the |
| 349 * control message. This is after any previous control message | 344 * control message. This is after any previous control message |
| 350 * from the same isolate has been received. | 345 * from the same isolate has been received, but may be during |
| 346 * execution of another event. |
| 351 * * `BEFORE_NEXT_EVENT`: The response is scheduled for the next time | 347 * * `BEFORE_NEXT_EVENT`: The response is scheduled for the next time |
| 352 * control returns to the event loop of the receiving isolate, | 348 * control returns to the event loop of the receiving isolate, |
| 353 * after the current event, and any already scheduled control events, | 349 * after the current event, and any already scheduled control events, |
| 354 * are completed. | 350 * are completed. |
| 355 * * `AS_EVENT`: The response is not sent until all prevously sent | 351 * |
| 356 * non-control messages from the current isolate to the receiving isolate | 352 * If `response` cannot be sent to the isolate, then the request is ignored. |
| 357 * have been processed. | 353 * It is recommended to only use simple values that can be sent to all |
| 358 * The ping effectively puts the response into the normal event queue | 354 * isolates, like `null`, booleans, numbers or strings. |
| 359 * after previously sent messages, and it is affected by any control | |
| 360 * messages that affect normal events, including `pause`. | |
| 361 * This can be used to wait for a another event to be processed. | |
| 362 */ | 355 */ |
| 363 external void ping(SendPort responsePort, [int pingType = IMMEDIATE]); | 356 external void ping(SendPort responsePort, {Object response, |
| 357 int priority: IMMEDIATE}); |
| 364 | 358 |
| 365 /** | 359 /** |
| 366 * Requests that uncaught errors of the isolate are sent back to [port]. | 360 * Requests that uncaught errors of the isolate are sent back to [port]. |
| 367 * | 361 * |
| 368 * WARNING: This method is experimental and not handled on every platform yet. | 362 * WARNING: This method is experimental and not handled on every platform yet. |
| 369 * | 363 * |
| 370 * The errors are sent back as two elements lists. | 364 * The errors are sent back as two elements lists. |
| 371 * The first element is a `String` representation of the error, usually | 365 * The first element is a `String` representation of the error, usually |
| 372 * created by calling `toString` on the error. | 366 * created by calling `toString` on the error. |
| 373 * The second element is a `String` representation of an accompanying | 367 * The second element is a `String` representation of an accompanying |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 : _description = description, | 603 : _description = description, |
| 610 stackTrace = new _RemoteStackTrace(stackDescription); | 604 stackTrace = new _RemoteStackTrace(stackDescription); |
| 611 String toString() => _description; | 605 String toString() => _description; |
| 612 } | 606 } |
| 613 | 607 |
| 614 class _RemoteStackTrace implements StackTrace { | 608 class _RemoteStackTrace implements StackTrace { |
| 615 String _trace; | 609 String _trace; |
| 616 _RemoteStackTrace(this._trace); | 610 _RemoteStackTrace(this._trace); |
| 617 String toString() => _trace; | 611 String toString() => _trace; |
| 618 } | 612 } |
| OLD | NEW |