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

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

Issue 179823002: Add Isolate.onExit. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 6 years, 9 months 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 | Annotate | Revision Log
« no previous file with comments | « sdk/lib/_internal/lib/isolate_helper.dart ('k') | tests/isolate/isolate.status » ('j') | 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 18 matching lines...) Expand all
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;
40 43
41 Isolate._fromControlPort(this.controlPort, [this.pauseCapability]); 44 Isolate._fromControlPort(this.controlPort, [this.pauseCapability]);
42 45
43 /** 46 /**
44 * Creates and spawns an isolate that shares the same code as the current 47 * Creates and spawns an isolate that shares the same code as the current
45 * isolate. 48 * isolate.
46 * 49 *
47 * The argument [entryPoint] specifies the entry point of the spawned 50 * The argument [entryPoint] specifies the entry point of the spawned
48 * isolate. It must be a top-level function or a static method that 51 * isolate. It must be a top-level function or a static method that
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 * Returns a future that will complete with an [Isolate] instance if the 83 * Returns a future that will complete with an [Isolate] instance if the
81 * spawning succeeded. It will complete with an error otherwise. 84 * spawning succeeded. It will complete with an error otherwise.
82 */ 85 */
83 external static Future<Isolate> spawnUri( 86 external static Future<Isolate> spawnUri(
84 Uri uri, List<String> args, var message, { bool paused: false }); 87 Uri uri, List<String> args, var message, { bool paused: false });
85 88
86 89
87 /** 90 /**
88 * Requests the isolate to pause. 91 * Requests the isolate to pause.
89 * 92 *
93 * WARNING: This method is experimental and not handled on every platform yet.
94 *
90 * The isolate should stop handling events by pausing its event queue. 95 * The isolate should stop handling events by pausing its event queue.
91 * The request will eventually make the isolate stop doing anything. 96 * The request will eventually make the isolate stop doing anything.
92 * It will be handled before any other messages sent to the isolate from 97 * It will be handled before any other messages that are later sent to the
93 * the current isolate, but no other guarantees are provided. 98 * isolate from the current isolate, but no other guarantees are provided.
99 *
100 * The event loop may be paused before previously sent, but not yet exeuted,
101 * messages have been reached.
94 * 102 *
95 * If [resumeCapability] is provided, it is used to identity the pause, 103 * If [resumeCapability] is provided, it is used to identity the pause,
96 * and must be used again to end the pause using [resume]. 104 * and must be used again to end the pause using [resume].
97 * Otherwise a new capability is created and returned. 105 * Otherwise a new resume capability is created and returned.
98 * 106 *
99 * If an isolate is paused more than once using the same capabilty, 107 * 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. 108 * only one resume with that capability is needed to end the pause.
101 * 109 *
102 * If an isolate is paused using more than one capability, 110 * If an isolate is paused using more than one capability,
103 * they must all be individully ended before the isolate resumes. 111 * they must all be individully ended before the isolate resumes.
104 * 112 *
105 * Returns the capability that must be used to resume end the pause. 113 * Returns the capability that must be used to resume end the pause.
106 *
107 * WARNING: This method is not handled on any platform yet.
108 */ 114 */
109 Capability pause([Capability resumeCapability]) { 115 Capability pause([Capability resumeCapability]) {
110 if (resumeCapability == null) resumeCapability = new Capability(); 116 if (resumeCapability == null) resumeCapability = new Capability();
111 var message = new List(3) 117 var message = new List(3)
112 ..[0] = "pause" 118 ..[0] = "pause"
113 ..[1] = pauseCapability 119 ..[1] = pauseCapability
114 ..[2] = resumeCapability; 120 ..[2] = resumeCapability;
115 controlPort.send(message); 121 controlPort.send(message);
116 return resumeCapability; 122 return resumeCapability;
117 } 123 }
118 124
119 /** 125 /**
120 * Resumes a paused isolate. 126 * Resumes a paused isolate.
121 * 127 *
128 * WARNING: This method is experimental and not handled on every platform yet.
129 *
122 * Sends a message to an isolate requesting that it ends a pause 130 * Sends a message to an isolate requesting that it ends a pause
123 * that was requested using the [resumeCapability]. 131 * that was requested using the [resumeCapability].
124 * 132 *
133 * When all active pause requests have been cancelled, the isolate
134 * will continue handling normal messages.
135 *
125 * The capability must be one returned by a call to [pause] on this 136 * The capability must be one returned by a call to [pause] on this
126 * isolate, otherwise the resume call does nothing. 137 * isolate, otherwise the resume call does nothing.
127 *
128 * WARNING: This method is not handled on any platform yet.
129 */ 138 */
130 void resume(Capability resumeCapability) { 139 void resume(Capability resumeCapability) {
131 var message = new List(2) 140 var message = new List(2)
132 ..[0] = "resume" 141 ..[0] = "resume"
133 ..[1] = resumeCapability; 142 ..[1] = resumeCapability;
134 controlPort.send(message); 143 controlPort.send(message);
135 } 144 }
145
146 /**
147 * Asks the isolate to send a message on [responsePort] when it terminates.
148 *
149 * WARNING: This method is experimental and not handled on every platform yet.
150 *
151 * The isolate will send a `null` message on [responsePort] as the last
152 * thing before it terminates. It will run no further code after the message
153 * has been sent.
154 *
155 * If the isolate is already dead, no message will be sent.
156 * TODO(lrn): Can we do better? Can the system recognize this message and
157 * send a reply if the receiving isolate is dead?
158 */
159 void addOnExitListener(SendPort responsePort) {
160 // TODO(lrn): Can we have an internal method that checks if the receiving
161 // isolate of a SendPort is still alive?
162 var message = new List(2)
163 ..[0] = "add-ondone"
164 ..[1] = responsePort;
165 controlPort.send(message);
166 }
167
168 /**
169 * Stop listening on exit messages from the isolate.
170 *
171 * WARNING: This method is experimental and not handled on every platform yet.
172 *
173 * If a call has previously been made to [addOnExitListener] with the same
174 * send-port, this will unregister the port, and it will no longer receive
175 * a message when the isolate terminates.
176 * A response may still be sent until this operation is fully processed by
177 * the isolate.
178 */
179 void removeOnExitListener(SendPort responsePort) {
180 var message = new List(2)
181 ..[0] = "remove-ondone"
182 ..[1] = responsePort;
183 controlPort.send(message);
184 }
136 } 185 }
137 186
138 /** 187 /**
139 * Sends messages to its [ReceivePort]s. 188 * Sends messages to its [ReceivePort]s.
140 * 189 *
141 * [SendPort]s are created from [ReceivePort]s. Any message sent through 190 * [SendPort]s are created from [ReceivePort]s. Any message sent through
142 * a [SendPort] is delivered to its corresponding [ReceivePort]. There might be 191 * a [SendPort] is delivered to its corresponding [ReceivePort]. There might be
143 * many [SendPort]s for the same [ReceivePort]. 192 * many [SendPort]s for the same [ReceivePort].
144 * 193 *
145 * [SendPort]s can be transmitted to other isolates. 194 * [SendPort]s can be transmitted to other isolates.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 const _IsolateUnhandledException(this.message, this.source, this.stackTrace); 340 const _IsolateUnhandledException(this.message, this.source, this.stackTrace);
292 341
293 String toString() { 342 String toString() {
294 return 'IsolateUnhandledException: exception while handling message: ' 343 return 'IsolateUnhandledException: exception while handling message: '
295 '${message} \n ' 344 '${message} \n '
296 '${source.toString().replaceAll("\n", "\n ")}\n' 345 '${source.toString().replaceAll("\n", "\n ")}\n'
297 'original stack trace:\n ' 346 'original stack trace:\n '
298 '${stackTrace.toString().replaceAll("\n","\n ")}'; 347 '${stackTrace.toString().replaceAll("\n","\n ")}';
299 } 348 }
300 } 349 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/lib/isolate_helper.dart ('k') | tests/isolate/isolate.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698