| 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 library _isolate_helper; | 5 library _isolate_helper; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection' show Queue, HashMap; | 8 import 'dart:collection' show Queue, HashMap; |
| 9 import 'dart:isolate'; | 9 import 'dart:isolate'; |
| 10 import 'dart:_js_helper' show | 10 import 'dart:_js_helper' show |
| (...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 bool operator ==(var other); | 722 bool operator ==(var other); |
| 723 int get hashCode; | 723 int get hashCode; |
| 724 } | 724 } |
| 725 | 725 |
| 726 /** A send port that delivers messages in-memory via native JavaScript calls. */ | 726 /** A send port that delivers messages in-memory via native JavaScript calls. */ |
| 727 class _NativeJsSendPort extends _BaseSendPort implements SendPort { | 727 class _NativeJsSendPort extends _BaseSendPort implements SendPort { |
| 728 final ReceivePortImpl _receivePort; | 728 final ReceivePortImpl _receivePort; |
| 729 | 729 |
| 730 const _NativeJsSendPort(this._receivePort, int isolateId) : super(isolateId); | 730 const _NativeJsSendPort(this._receivePort, int isolateId) : super(isolateId); |
| 731 | 731 |
| 732 void send(var message, [SendPort replyTo]) { | 732 void send(var message) { |
| 733 _waitForPendingPorts(message, () { | 733 _waitForPendingPorts(message, () { |
| 734 // Check that the isolate still runs and the port is still open | 734 // Check that the isolate still runs and the port is still open |
| 735 final isolate = _globalState.isolates[_isolateId]; | 735 final isolate = _globalState.isolates[_isolateId]; |
| 736 if (isolate == null) return; | 736 if (isolate == null) return; |
| 737 if (_receivePort._controller.isClosed) return; | 737 if (_receivePort._controller.isClosed) return; |
| 738 | 738 |
| 739 // We force serialization/deserialization as a simple way to ensure | 739 // We force serialization/deserialization as a simple way to ensure |
| 740 // isolate communication restrictions are respected between isolates that | 740 // isolate communication restrictions are respected between isolates that |
| 741 // live in the same worker. [_NativeJsSendPort] delivers both messages | 741 // live in the same worker. [_NativeJsSendPort] delivers both messages |
| 742 // from the same worker and messages from other workers. In particular, | 742 // from the same worker and messages from other workers. In particular, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 768 | 768 |
| 769 /** A send port that delivers messages via worker.postMessage. */ | 769 /** A send port that delivers messages via worker.postMessage. */ |
| 770 // TODO(eub): abstract this for iframes. | 770 // TODO(eub): abstract this for iframes. |
| 771 class _WorkerSendPort extends _BaseSendPort implements SendPort { | 771 class _WorkerSendPort extends _BaseSendPort implements SendPort { |
| 772 final int _workerId; | 772 final int _workerId; |
| 773 final int _receivePortId; | 773 final int _receivePortId; |
| 774 | 774 |
| 775 const _WorkerSendPort(this._workerId, int isolateId, this._receivePortId) | 775 const _WorkerSendPort(this._workerId, int isolateId, this._receivePortId) |
| 776 : super(isolateId); | 776 : super(isolateId); |
| 777 | 777 |
| 778 void send(var message, [SendPort replyTo]) { | 778 void send(var message) { |
| 779 _waitForPendingPorts(message, () { | 779 _waitForPendingPorts(message, () { |
| 780 final workerMessage = _serializeMessage({ | 780 final workerMessage = _serializeMessage({ |
| 781 'command': 'message', | 781 'command': 'message', |
| 782 'port': this, | 782 'port': this, |
| 783 'msg': message}); | 783 'msg': message}); |
| 784 | 784 |
| 785 if (_globalState.isWorker) { | 785 if (_globalState.isWorker) { |
| 786 // Communication from one worker to another go through the | 786 // Communication from one worker to another go through the |
| 787 // main worker. | 787 // main worker. |
| 788 _globalState.mainManager.postMessage(workerMessage); | 788 _globalState.mainManager.postMessage(workerMessage); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 } | 839 } |
| 840 pending = null; | 840 pending = null; |
| 841 }); | 841 }); |
| 842 } | 842 } |
| 843 | 843 |
| 844 _BufferingSendPort.fromPort(isolateId, this._port) | 844 _BufferingSendPort.fromPort(isolateId, this._port) |
| 845 : super(isolateId), _id = _idCount { | 845 : super(isolateId), _id = _idCount { |
| 846 _idCount++; | 846 _idCount++; |
| 847 } | 847 } |
| 848 | 848 |
| 849 void send(var message, [SendPort replyTo]) { | 849 void send(var message) { |
| 850 if (_port != null) { | 850 if (_port != null) { |
| 851 _port.send(message, replyTo); | 851 _port.send(message); |
| 852 } else { | 852 } else { |
| 853 pending.add(message); | 853 pending.add(message); |
| 854 } | 854 } |
| 855 } | 855 } |
| 856 | 856 |
| 857 bool operator ==(var other) => | 857 bool operator ==(var other) => |
| 858 other is _BufferingSendPort && _id == other._id; | 858 other is _BufferingSendPort && _id == other._id; |
| 859 int get hashCode => _id; | 859 int get hashCode => _id; |
| 860 } | 860 } |
| 861 | 861 |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 _handle = null; | 1374 _handle = null; |
| 1375 } else { | 1375 } else { |
| 1376 throw new UnsupportedError("Canceling a timer."); | 1376 throw new UnsupportedError("Canceling a timer."); |
| 1377 } | 1377 } |
| 1378 } | 1378 } |
| 1379 | 1379 |
| 1380 bool get isActive => _handle != null; | 1380 bool get isActive => _handle != null; |
| 1381 } | 1381 } |
| 1382 | 1382 |
| 1383 bool hasTimer() => JS('', '#.setTimeout', globalThis) != null; | 1383 bool hasTimer() => JS('', '#.setTimeout', globalThis) != null; |
| OLD | NEW |