Chromium Code Reviews| 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 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 | 488 |
| 489 /** | 489 /** |
| 490 * Returns a broadcast stream of uncaught errors from the isolate. | 490 * Returns a broadcast stream of uncaught errors from the isolate. |
| 491 * | 491 * |
| 492 * Each error is provided as an error event on the stream. | 492 * Each error is provided as an error event on the stream. |
| 493 * | 493 * |
| 494 * The actual error object and stackTraces will not necessarily | 494 * The actual error object and stackTraces will not necessarily |
| 495 * be the same object types as in the actual isolate, but they will | 495 * be the same object types as in the actual isolate, but they will |
| 496 * always have the same [Object.toString] result. | 496 * always have the same [Object.toString] result. |
| 497 * | 497 * |
| 498 * This stream is based on [addErrorListener] and [removeErrorListener]. | 498 * The returned stream is done when the isolate terminates. |
| 499 * | |
| 500 * If the isolate has already terminated, the stream will never emit | |
| 501 * any events, not even a done event. | |
| 502 * If the isolate terminates while nobody is listening, the returned | |
|
floitsch
2016/12/07 16:12:00
Doesn't this sentence imply the first one?
| |
| 503 * stream will also not emit a done event. | |
| 504 * | |
| 505 * This stream is based on [addErrorListener], [removeErrorListener], | |
| 506 * [addOnExitListener] and [removeOnExitListener]. | |
| 499 */ | 507 */ |
| 500 Stream get errors { | 508 Stream get errors { |
| 501 StreamController controller; | 509 StreamController controller; |
| 502 RawReceivePort port; | 510 RawReceivePort port; |
| 503 void handleError(message) { | 511 void handleError(message) { |
| 504 String errorDescription = message[0]; | 512 if (message != null) { |
| 505 String stackDescription = message[1]; | 513 String errorDescription = message[0]; |
| 506 var error = new RemoteError(errorDescription, stackDescription); | 514 String stackDescription = message[1]; |
| 507 controller.addError(error, error.stackTrace); | 515 var error = new RemoteError(errorDescription, stackDescription); |
| 516 controller.addError(error, error.stackTrace); | |
| 517 } else { | |
| 518 port.close(); | |
| 519 controller.close(); | |
| 520 } | |
| 508 } | 521 } |
| 509 controller = new StreamController.broadcast( | 522 controller = new StreamController.broadcast( |
| 510 sync: true, | 523 sync: true, |
| 511 onListen: () { | 524 onListen: () { |
| 512 port = new RawReceivePort(handleError); | 525 port = new RawReceivePort(handleError); |
| 526 this.addOnExitListener(port.sendPort); | |
| 513 this.addErrorListener(port.sendPort); | 527 this.addErrorListener(port.sendPort); |
| 514 }, | 528 }, |
| 515 onCancel: () { | 529 onCancel: () { |
| 516 this.removeErrorListener(port.sendPort); | 530 this.removeErrorListener(port.sendPort); |
| 531 this.removeOnExitListener(port.sendPort); | |
| 517 port.close(); | 532 port.close(); |
| 518 port = null; | 533 port = null; |
| 519 }); | 534 }); |
| 520 return controller.stream; | 535 return controller.stream; |
| 521 } | 536 } |
| 522 } | 537 } |
| 523 | 538 |
| 524 /** | 539 /** |
| 525 * Sends messages to its [ReceivePort]s. | 540 * Sends messages to its [ReceivePort]s. |
| 526 * | 541 * |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 670 * as the original error, but has no other features of the original error. | 685 * as the original error, but has no other features of the original error. |
| 671 */ | 686 */ |
| 672 class RemoteError implements Error { | 687 class RemoteError implements Error { |
| 673 final String _description; | 688 final String _description; |
| 674 final StackTrace stackTrace; | 689 final StackTrace stackTrace; |
| 675 RemoteError(String description, String stackDescription) | 690 RemoteError(String description, String stackDescription) |
| 676 : _description = description, | 691 : _description = description, |
| 677 stackTrace = new StackTrace.fromString(stackDescription); | 692 stackTrace = new StackTrace.fromString(stackDescription); |
| 678 String toString() => _description; | 693 String toString() => _description; |
| 679 } | 694 } |
| OLD | NEW |