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 * A native object that is shared across isolates. This object is visible to all | 6 * A native object that is shared across isolates. This object is visible to all |
| 7 * isolates running on the same worker (either UI or background web worker). | 7 * isolates running on the same worker (either UI or background web worker). |
| 8 * | 8 * |
| 9 * This is code that is intended to 'escape' the isolate boundaries in order to | 9 * This is code that is intended to 'escape' the isolate boundaries in order to |
| 10 * implement the semantics of isolates in JavaScript. Without this we would have | 10 * implement the semantics of isolates in JavaScript. Without this we would have |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 void postMessage(msg) native "return this.postMessage(msg);"; | 286 void postMessage(msg) native "return this.postMessage(msg);"; |
| 287 } | 287 } |
| 288 | 288 |
| 289 final String _SPAWNED_SIGNAL = "spawned"; | 289 final String _SPAWNED_SIGNAL = "spawned"; |
| 290 | 290 |
| 291 class _IsolateNatives { | 291 class _IsolateNatives { |
| 292 | 292 |
| 293 /** JavaScript-specific implementation to spawn an isolate. */ | 293 /** JavaScript-specific implementation to spawn an isolate. */ |
| 294 static Future<SendPort> spawn(Isolate isolate, bool isLight) { | 294 static Future<SendPort> spawn(Isolate isolate, bool isLight) { |
| 295 Completer<SendPort> completer = new Completer<SendPort>(); | 295 Completer<SendPort> completer = new Completer<SendPort>(); |
| 296 ReceivePort port = new ReceivePort.singleShot(); | 296 ReceivePort port = new ReceivePort(); |
| 297 port.receive((msg, SendPort replyPort) { | 297 port.receive((msg, SendPort replyPort) { |
| 298 port.close(); | |
|
eub
2012/03/09 18:33:10
I wonder how often people are going to write this
eub
2012/03/09 18:33:10
I saw about a dozen instances looking over this CL
Siggi Cherem (dart-lang)
2012/03/10 03:10:00
Yeah - this is something that I saw commonly in te
| |
| 298 assert(msg == _SPAWNED_SIGNAL); | 299 assert(msg == _SPAWNED_SIGNAL); |
| 299 completer.complete(replyPort); | 300 completer.complete(replyPort); |
| 300 }); | 301 }); |
| 301 | 302 |
| 302 // TODO(floitsch): throw exception if isolate's class doesn't have a | 303 // TODO(floitsch): throw exception if isolate's class doesn't have a |
| 303 // default constructor. | 304 // default constructor. |
| 304 if (_globalState.useWorkers && !isLight) { | 305 if (_globalState.useWorkers && !isLight) { |
| 305 _startWorker(isolate, port.toSendPort()); | 306 _startWorker(isolate, port.toSendPort()); |
| 306 } else { | 307 } else { |
| 307 _startNonWorker(isolate, port.toSendPort()); | 308 _startNonWorker(isolate, port.toSendPort()); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 536 _fillStatics(_globalState.currentContext); | 537 _fillStatics(_globalState.currentContext); |
| 537 ReceivePort port = new ReceivePort(); | 538 ReceivePort port = new ReceivePort(); |
| 538 replyTo.send(_SPAWNED_SIGNAL, port.toSendPort()); | 539 replyTo.send(_SPAWNED_SIGNAL, port.toSendPort()); |
| 539 isolate._run(port); | 540 isolate._run(port); |
| 540 } | 541 } |
| 541 | 542 |
| 542 // TODO(sigmund): clean up above, after we make the new API the default: | 543 // TODO(sigmund): clean up above, after we make the new API the default: |
| 543 | 544 |
| 544 static _spawn2(String functionName, String uri, bool isLight) { | 545 static _spawn2(String functionName, String uri, bool isLight) { |
| 545 Completer<SendPort> completer = new Completer<SendPort>(); | 546 Completer<SendPort> completer = new Completer<SendPort>(); |
| 546 ReceivePort port = new ReceivePort.singleShot(); | 547 ReceivePort port = new ReceivePort(); |
| 547 port.receive((msg, SendPort replyPort) { | 548 port.receive((msg, SendPort replyPort) { |
| 549 port.close(); | |
| 548 assert(msg == _SPAWNED_SIGNAL); | 550 assert(msg == _SPAWNED_SIGNAL); |
| 549 completer.complete(replyPort); | 551 completer.complete(replyPort); |
| 550 }); | 552 }); |
| 551 | 553 |
| 552 SendPort signalReply = port.toSendPort(); | 554 SendPort signalReply = port.toSendPort(); |
| 553 | 555 |
| 554 if (_globalState.useWorkers && !isLight) { | 556 if (_globalState.useWorkers && !isLight) { |
| 555 _startWorker2(functionName, uri, signalReply); | 557 _startWorker2(functionName, uri, signalReply); |
| 556 } else { | 558 } else { |
| 557 _startNonWorker2(functionName, uri, signalReply); | 559 _startNonWorker2(functionName, uri, signalReply); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 614 'command': 'start2', | 616 'command': 'start2', |
| 615 'id': workerId, | 617 'id': workerId, |
| 616 // Note: we serialize replyPort twice because the child worker needs to | 618 // Note: we serialize replyPort twice because the child worker needs to |
| 617 // first deserialize the worker id, before it can correctly deserialize | 619 // first deserialize the worker id, before it can correctly deserialize |
| 618 // the port (port deserialization is sensitive to what is the current | 620 // the port (port deserialization is sensitive to what is the current |
| 619 // workerId). | 621 // workerId). |
| 620 'replyTo': _serializeMessage(replyPort), | 622 'replyTo': _serializeMessage(replyPort), |
| 621 'functionName': functionName })); | 623 'functionName': functionName })); |
| 622 } | 624 } |
| 623 } | 625 } |
| OLD | NEW |