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 18 matching lines...) Expand all Loading... | |
| 29 } | 29 } |
| 30 | 30 |
| 31 class Isolate { | 31 class Isolate { |
| 32 /** | 32 /** |
| 33 * Control port used to send control messages to the isolate. | 33 * Control port used to send control messages to the isolate. |
| 34 * | 34 * |
| 35 * This class provides helper functions that sends control messages | 35 * This class provides helper functions that sends control messages |
| 36 * to the control port. | 36 * to the control port. |
| 37 */ | 37 */ |
| 38 final SendPort controlPort; | 38 final SendPort controlPort; |
| 39 /** | |
| 40 * Capability granting the ability to pause the isolate. | |
| 41 */ | |
| 39 final Capability pauseCapability; | 42 final Capability pauseCapability; |
| 43 /** | |
| 44 * Capability granting the ability to inspect the isolate. | |
| 45 * | |
| 46 * This capability is needed to be able to see uncaught errors and exit of | |
| 47 * the isolate. | |
|
floitsch
2014/02/25 19:25:48
I don't think inspecting is the same as being able
Lasse Reichstein Nielsen
2014/02/27 08:04:28
Would "observe" be a better word. It suggests a mo
| |
| 48 */ | |
| 49 final Capability inspectCapability; | |
| 40 | 50 |
| 41 Isolate._fromControlPort(this.controlPort, [this.pauseCapability]); | 51 Isolate._fromControlPort(this.controlPort, [this.pauseCapability, |
| 52 this.inspectCapability]); | |
| 42 | 53 |
| 43 /** | 54 /** |
| 44 * Creates and spawns an isolate that shares the same code as the current | 55 * Creates and spawns an isolate that shares the same code as the current |
| 45 * isolate. | 56 * isolate. |
| 46 * | 57 * |
| 47 * The argument [entryPoint] specifies the entry point of the spawned | 58 * The argument [entryPoint] specifies the entry point of the spawned |
| 48 * isolate. It must be a top-level function or a static method that | 59 * isolate. It must be a top-level function or a static method that |
| 49 * takes one argument - that is, one-parameter functions that can be | 60 * takes one argument - that is, one-parameter functions that can be |
| 50 * compile-time constant function values. | 61 * compile-time constant function values. |
| 51 * It is not allowed to pass the value of function expressions or an instance | 62 * It is not allowed to pass the value of function expressions or an instance |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 * | 100 * |
| 90 * The isolate should stop handling events by pausing its event queue. | 101 * The isolate should stop handling events by pausing its event queue. |
| 91 * The request will eventually make the isolate stop doing anything. | 102 * The request will eventually make the isolate stop doing anything. |
| 92 * It will be handled before any other messages sent to the isolate from | 103 * It will be handled before any other messages sent to the isolate from |
| 93 * the current isolate, but no other guarantees are provided. | 104 * the current isolate, but no other guarantees are provided. |
| 94 * | 105 * |
| 95 * If [resumeCapability] is provided, it is used to identity the pause, | 106 * If [resumeCapability] is provided, it is used to identity the pause, |
| 96 * and must be used again to end the pause using [resume]. | 107 * and must be used again to end the pause using [resume]. |
| 97 * Otherwise a new capability is created and returned. | 108 * Otherwise a new capability is created and returned. |
| 98 * | 109 * |
| 99 * If an isolate is paused more than once using the same capabilty, | 110 * If an isolate is paused more than once using the same capability, |
| 100 * only one resume with that capability is needed to end the pause. | 111 * only one resume with that capability is needed to end the pause. |
| 101 * | 112 * |
| 102 * If an isolate is paused using more than one capability, | 113 * If an isolate is paused using more than one capability, |
| 103 * they must all be individully ended before the isolate resumes. | 114 * they must all be individully ended before the isolate resumes. |
| 104 * | 115 * |
| 105 * Returns the capability that must be used to resume end the pause. | 116 * Returns the capability that must be used to resume end the pause. |
| 106 * | 117 * |
| 107 * WARNING: This method is not handled on any platform yet. | 118 * WARNING: This method is not handled on any platform yet. |
| 108 */ | 119 */ |
| 109 Capability pause([Capability resumeCapability]) { | 120 Capability pause([Capability resumeCapability]) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 126 * isolate, otherwise the resume call does nothing. | 137 * isolate, otherwise the resume call does nothing. |
| 127 * | 138 * |
| 128 * WARNING: This method is not handled on any platform yet. | 139 * WARNING: This method is not handled on any platform yet. |
| 129 */ | 140 */ |
| 130 void resume(Capability resumeCapability) { | 141 void resume(Capability resumeCapability) { |
| 131 var message = new List(2) | 142 var message = new List(2) |
| 132 ..[0] = "resume" | 143 ..[0] = "resume" |
| 133 ..[1] = resumeCapability; | 144 ..[1] = resumeCapability; |
| 134 controlPort.send(message); | 145 controlPort.send(message); |
| 135 } | 146 } |
| 147 | |
| 148 /** | |
| 149 * Returns a future that completes after the isolate has terminated. | |
| 150 */ | |
| 151 Future get onExit { | |
| 152 // Should we return a broadcast stream instead? It has the advantage | |
|
floitsch
2014/02/25 19:25:48
I don't see any stream.
Lasse Reichstein Nielsen
2014/02/27 08:04:28
No, I was suggesting a broadcast stream instead of
| |
| 153 // that you can stop listening again. | |
| 154 var completer = new Completer(); | |
| 155 var receivePort; | |
| 156 receivePort = new RawReceivePort((_) { | |
| 157 completer.complete(); | |
| 158 receivePort.close(); | |
| 159 }); | |
| 160 var message = new List(3) | |
| 161 ..[0] = "ondone" | |
| 162 ..[1] = inspectCapability | |
| 163 ..[2] = receivePort.sendPort; | |
| 164 controlPort.send(message); | |
| 165 return completer.future; | |
| 166 } | |
| 136 } | 167 } |
| 137 | 168 |
| 138 /** | 169 /** |
| 139 * Sends messages to its [ReceivePort]s. | 170 * Sends messages to its [ReceivePort]s. |
| 140 * | 171 * |
| 141 * [SendPort]s are created from [ReceivePort]s. Any message sent through | 172 * [SendPort]s are created from [ReceivePort]s. Any message sent through |
| 142 * a [SendPort] is delivered to its corresponding [ReceivePort]. There might be | 173 * a [SendPort] is delivered to its corresponding [ReceivePort]. There might be |
| 143 * many [SendPort]s for the same [ReceivePort]. | 174 * many [SendPort]s for the same [ReceivePort]. |
| 144 * | 175 * |
| 145 * [SendPort]s can be transmitted to other isolates. | 176 * [SendPort]s can be transmitted to other isolates. |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 291 const _IsolateUnhandledException(this.message, this.source, this.stackTrace); | 322 const _IsolateUnhandledException(this.message, this.source, this.stackTrace); |
| 292 | 323 |
| 293 String toString() { | 324 String toString() { |
| 294 return 'IsolateUnhandledException: exception while handling message: ' | 325 return 'IsolateUnhandledException: exception while handling message: ' |
| 295 '${message} \n ' | 326 '${message} \n ' |
| 296 '${source.toString().replaceAll("\n", "\n ")}\n' | 327 '${source.toString().replaceAll("\n", "\n ")}\n' |
| 297 'original stack trace:\n ' | 328 'original stack trace:\n ' |
| 298 '${stackTrace.toString().replaceAll("\n","\n ")}'; | 329 '${stackTrace.toString().replaceAll("\n","\n ")}'; |
| 299 } | 330 } |
| 300 } | 331 } |
| OLD | NEW |