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 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 void postMessage(msg) native "return this.postMessage(msg);"; | 301 void postMessage(msg) native "return this.postMessage(msg);"; |
302 } | 302 } |
303 | 303 |
304 final String _SPAWNED_SIGNAL = "spawned"; | 304 final String _SPAWNED_SIGNAL = "spawned"; |
305 | 305 |
306 class _IsolateNatives { | 306 class _IsolateNatives { |
307 | 307 |
308 /** JavaScript-specific implementation to spawn an isolate. */ | 308 /** JavaScript-specific implementation to spawn an isolate. */ |
309 static Future<SendPort> spawn(Isolate isolate, bool isLight) { | 309 static Future<SendPort> spawn(Isolate isolate, bool isLight) { |
310 Completer<SendPort> completer = new Completer<SendPort>(); | 310 Completer<SendPort> completer = new Completer<SendPort>(); |
311 ReceivePort port = new ReceivePort.singleShot(); | 311 ReceivePort port = new ReceivePort(); |
312 port.receive((msg, SendPort replyPort) { | 312 port.receive((msg, SendPort replyPort) { |
| 313 port.close(); |
313 assert(msg == _SPAWNED_SIGNAL); | 314 assert(msg == _SPAWNED_SIGNAL); |
314 completer.complete(replyPort); | 315 completer.complete(replyPort); |
315 }); | 316 }); |
316 | 317 |
317 // TODO(floitsch): throw exception if isolate's class doesn't have a | 318 // TODO(floitsch): throw exception if isolate's class doesn't have a |
318 // default constructor. | 319 // default constructor. |
319 if (_globalState.useWorkers && !isLight) { | 320 if (_globalState.useWorkers && !isLight) { |
320 _startWorker(isolate, port.toSendPort()); | 321 _startWorker(isolate, port.toSendPort()); |
321 } else { | 322 } else { |
322 _startNonWorker(isolate, port.toSendPort()); | 323 _startNonWorker(isolate, port.toSendPort()); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 _fillStatics(_globalState.currentContext); | 552 _fillStatics(_globalState.currentContext); |
552 ReceivePort port = new ReceivePort(); | 553 ReceivePort port = new ReceivePort(); |
553 replyTo.send(_SPAWNED_SIGNAL, port.toSendPort()); | 554 replyTo.send(_SPAWNED_SIGNAL, port.toSendPort()); |
554 isolate._run(port); | 555 isolate._run(port); |
555 } | 556 } |
556 | 557 |
557 // TODO(sigmund): clean up above, after we make the new API the default: | 558 // TODO(sigmund): clean up above, after we make the new API the default: |
558 | 559 |
559 static _spawn2(String functionName, String uri, bool isLight) { | 560 static _spawn2(String functionName, String uri, bool isLight) { |
560 Completer<SendPort> completer = new Completer<SendPort>(); | 561 Completer<SendPort> completer = new Completer<SendPort>(); |
561 ReceivePort port = new ReceivePort.singleShot(); | 562 ReceivePort port = new ReceivePort(); |
562 port.receive((msg, SendPort replyPort) { | 563 port.receive((msg, SendPort replyPort) { |
| 564 port.close(); |
563 assert(msg == _SPAWNED_SIGNAL); | 565 assert(msg == _SPAWNED_SIGNAL); |
564 completer.complete(replyPort); | 566 completer.complete(replyPort); |
565 }); | 567 }); |
566 | 568 |
567 SendPort signalReply = port.toSendPort(); | 569 SendPort signalReply = port.toSendPort(); |
568 | 570 |
569 if (_globalState.useWorkers && !isLight) { | 571 if (_globalState.useWorkers && !isLight) { |
570 _startWorker2(functionName, uri, signalReply); | 572 _startWorker2(functionName, uri, signalReply); |
571 } else { | 573 } else { |
572 _startNonWorker2(functionName, uri, signalReply); | 574 _startNonWorker2(functionName, uri, signalReply); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 'command': 'start2', | 631 'command': 'start2', |
630 'id': workerId, | 632 'id': workerId, |
631 // Note: we serialize replyPort twice because the child worker needs to | 633 // Note: we serialize replyPort twice because the child worker needs to |
632 // first deserialize the worker id, before it can correctly deserialize | 634 // first deserialize the worker id, before it can correctly deserialize |
633 // the port (port deserialization is sensitive to what is the current | 635 // the port (port deserialization is sensitive to what is the current |
634 // workerId). | 636 // workerId). |
635 'replyTo': _serializeMessage(replyPort), | 637 'replyTo': _serializeMessage(replyPort), |
636 'functionName': functionName })); | 638 'functionName': functionName })); |
637 } | 639 } |
638 } | 640 } |
OLD | NEW |