Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 class SendPortImpl implements SendPort { | 5 class SendPortImpl implements SendPort { |
| 6 | 6 |
| 7 const SendPortImpl(this._workerId, this._isolateId, this._receivePortId); | 7 const SendPortImpl(this._workerId, this._isolateId, this._receivePortId); |
| 8 | 8 |
| 9 void send(var message, [SendPort replyTo = null]) { | 9 void send(var message, [SendPort replyTo = null]) { |
| 10 // TODO(kasperl): get rid of _sendNow. | 10 if (replyTo !== null && !(replyTo is SendPortImpl)) { |
| 11 this._sendNow(message, replyTo); | 11 throw "SendPort::send: Illegal replyTo type."; |
|
Jennifer Messerly
2011/11/08 05:04:35
probably want to throw an actual exception type?
Siggi Cherem (dart-lang)
2011/11/08 17:56:42
will do - the current throw was basically copied o
| |
| 12 } | |
| 13 IsolateNatives.sendMessage(_workerId, _isolateId, _receivePortId, | |
| 14 _serializeMessage(message), _serializeMessage(replyTo)); | |
| 12 } | 15 } |
| 13 | 16 |
| 14 void _sendNow(var message, SendPort replyTo) native; | 17 // TODO(sigmund): get rid of _sendNow |
|
Jennifer Messerly
2011/11/08 05:04:35
I think you can just remove it? I didn't see any c
Siggi Cherem (dart-lang)
2011/11/08 17:56:42
Unfortunately some other code in corelib is still
| |
| 18 void _sendNow(var message, replyTo) { send(message, replyTo); } | |
| 19 | |
| 20 _serializeMessage(message) { | |
| 21 if (IsolateNatives.shouldSerialize) { | |
| 22 return _IsolateJsUtil._serializeObject(message); | |
| 23 } else { | |
| 24 return _IsolateJsUtil._copyObject(message); | |
| 25 } | |
| 26 } | |
| 15 | 27 |
| 16 ReceivePortSingleShotImpl call(var message) { | 28 ReceivePortSingleShotImpl call(var message) { |
| 17 final result = new ReceivePortSingleShotImpl(); | 29 final result = new ReceivePortSingleShotImpl(); |
| 18 this.send(message, result.toSendPort()); | 30 this.send(message, result.toSendPort()); |
| 19 return result; | 31 return result; |
| 20 } | 32 } |
| 21 | 33 |
| 22 ReceivePortSingleShotImpl _callNow(var message) { | 34 ReceivePortSingleShotImpl _callNow(var message) { |
| 23 final result = new ReceivePortSingleShotImpl(); | 35 final result = new ReceivePortSingleShotImpl(); |
| 24 this._sendNow(message, result.toSendPort()); | 36 send(message, result.toSendPort()); |
| 25 return result; | 37 return result; |
| 26 } | 38 } |
| 27 | 39 |
| 28 bool operator==(var other) { | 40 bool operator==(var other) { |
| 29 return (other is SendPortImpl) && | 41 return (other is SendPortImpl) && |
| 30 (_workerId == other._workerId) && | 42 (_workerId == other._workerId) && |
| 31 (_isolateId == other._isolateId) && | 43 (_isolateId == other._isolateId) && |
| 32 (_receivePortId == other._receivePortId); | 44 (_receivePortId == other._receivePortId); |
| 33 } | 45 } |
| 34 | 46 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 64 factory ReceivePort.singleShot() { | 76 factory ReceivePort.singleShot() { |
| 65 return new ReceivePortSingleShotImpl(); | 77 return new ReceivePortSingleShotImpl(); |
| 66 } | 78 } |
| 67 | 79 |
| 68 } | 80 } |
| 69 | 81 |
| 70 | 82 |
| 71 class ReceivePortImpl implements ReceivePort { | 83 class ReceivePortImpl implements ReceivePort { |
| 72 ReceivePortImpl() | 84 ReceivePortImpl() |
| 73 : _id = _nextFreeId++ { | 85 : _id = _nextFreeId++ { |
| 74 _register(_id); | 86 IsolateNatives.registerPort(_id, this); |
| 75 } | 87 } |
| 76 | 88 |
| 77 void receive(void onMessage(var message, SendPort replyTo)) { | 89 void receive(void onMessage(var message, SendPort replyTo)) { |
| 78 _callback = onMessage; | 90 _callback = onMessage; |
| 79 } | 91 } |
| 80 | 92 |
| 81 void close() { | 93 void close() { |
| 82 _callback = null; | 94 _callback = null; |
| 83 _unregister(_id); | 95 IsolateNatives.unregisterPort(_id); |
| 84 } | 96 } |
| 85 | 97 |
| 86 SendPort toSendPort() { | 98 SendPort toSendPort() { |
| 87 return _toNewSendPort(); | 99 return _toNewSendPort(); |
| 88 } | 100 } |
| 89 | 101 |
| 90 /** | 102 /** |
| 91 * Returns a fresh [SendPort]. The implementation is not allowed to cache | 103 * Returns a fresh [SendPort]. The implementation is not allowed to cache |
| 92 * existing ports. | 104 * existing ports. |
| 93 */ | 105 */ |
| 94 SendPort _toNewSendPort() { | 106 SendPort _toNewSendPort() { |
| 95 return new SendPortImpl(_currentWorkerId(), _currentIsolateId(), _id); | 107 return new SendPortImpl( |
| 108 IsolateNatives._currentWorkerId(), | |
| 109 IsolateNatives._currentIsolateId(), _id); | |
| 96 } | 110 } |
| 97 | 111 |
| 98 int _id; | 112 int _id; |
| 99 Function _callback = null; | 113 Function _callback; |
| 100 | 114 |
| 101 static int _nextFreeId = 1; | 115 static int _nextFreeId = 1; |
| 102 | 116 |
| 103 void _register(int id) native; | |
| 104 void _unregister(int id) native; | |
| 105 | |
| 106 static int _currentWorkerId() native; | |
| 107 static int _currentIsolateId() native; | |
| 108 | |
| 109 static void _invokeCallback(ReceivePortImpl port, message, replyTo) native { | |
| 110 if (port._callback !== null) (port._callback)(message, replyTo); | |
| 111 } | |
| 112 | |
| 113 static int _getId(ReceivePortImpl port) native { | 117 static int _getId(ReceivePortImpl port) native { |
| 114 return port._id; | 118 return port._id; |
| 115 } | 119 } |
| 120 | |
| 116 static Function _getCallback(ReceivePortImpl port) native { | 121 static Function _getCallback(ReceivePortImpl port) native { |
| 117 return port._callback; | 122 return port._callback; |
| 118 } | 123 } |
| 119 } | 124 } |
| 120 | 125 |
| 121 | 126 |
| 122 class ReceivePortSingleShotImpl implements ReceivePort { | 127 class ReceivePortSingleShotImpl implements ReceivePort { |
| 123 | 128 |
| 124 ReceivePortSingleShotImpl() : _port = new ReceivePortImpl() { } | 129 ReceivePortSingleShotImpl() : _port = new ReceivePortImpl() { } |
| 125 | 130 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 145 SendPort _toNewSendPort() { | 150 SendPort _toNewSendPort() { |
| 146 return _port._toNewSendPort(); | 151 return _port._toNewSendPort(); |
| 147 } | 152 } |
| 148 | 153 |
| 149 final ReceivePortImpl _port; | 154 final ReceivePortImpl _port; |
| 150 | 155 |
| 151 } | 156 } |
| 152 | 157 |
| 153 final String _SPAWNED_SIGNAL = "spawned"; | 158 final String _SPAWNED_SIGNAL = "spawned"; |
| 154 | 159 |
| 155 class IsolateNatives { | 160 class IsolateNatives native "IsolateNatives" { |
| 156 static Future<SendPort> spawn(Isolate isolate, bool isLight) { | 161 static Future<SendPort> spawn(Isolate isolate, bool isLight) { |
| 157 Completer<SendPort> completer = new Completer<SendPort>(); | 162 Completer<SendPort> completer = new Completer<SendPort>(); |
| 158 ReceivePort port = new ReceivePort.singleShot(); | 163 ReceivePort port = new ReceivePort.singleShot(); |
| 159 port.receive((msg, SendPort replyPort) { | 164 port.receive((msg, SendPort replyPort) { |
| 160 assert(msg == _SPAWNED_SIGNAL); | 165 assert(msg == _SPAWNED_SIGNAL); |
| 161 completer.complete(replyPort); | 166 completer.complete(replyPort); |
| 162 }); | 167 }); |
| 163 _spawn(isolate, isLight, port.toSendPort()); | 168 _spawn(isolate, isLight, port.toSendPort()); |
| 169 if (false) { | |
| 170 // TODO(sigmund): delete this code. This is temporarily added because we | |
| 171 // are tree-shaking methods that are only reachable from js | |
| 172 _IsolateJsUtil._startIsolate(null, null); | |
| 173 _IsolateJsUtil._deserializeMessage(null); | |
| 174 _IsolateJsUtil._print(null); | |
| 175 } | |
| 164 return completer.future; | 176 return completer.future; |
| 165 } | 177 } |
| 166 | 178 |
| 167 static SendPort _spawn(Isolate isolate, bool light, SendPort port) native; | 179 static SendPort _spawn(Isolate isolate, bool light, SendPort port) native; |
| 168 static Function bind(Function f) native; | 180 |
| 181 static bool get shouldSerialize() native; | |
| 182 | |
| 183 static void sendMessage(int workerId, int isolateId, int receivePortId, | |
| 184 message, replyTo) native; | |
| 185 | |
| 186 /** Registers an active receive port. */ | |
| 187 static void registerPort(int id, ReceivePort port) native; | |
| 188 | |
| 189 /** Unregister an inactive receive port. */ | |
| 190 static void unregisterPort(int id) native; | |
| 191 | |
| 192 static int _currentWorkerId() native; | |
| 193 | |
| 194 static int _currentIsolateId() native; | |
| 169 } | 195 } |
| 170 | 196 |
| 171 | 197 |
| 172 class _IsolateJsUtil { | 198 class _IsolateJsUtil native "_IsolateJsUtil" { |
| 173 static void _startIsolate(Isolate isolate, SendPort replyTo) native { | 199 static void _startIsolate(Isolate isolate, SendPort replyTo) native { |
| 174 ReceivePort port = new ReceivePort(); | 200 ReceivePort port = new ReceivePort(); |
| 175 replyTo.send(_SPAWNED_SIGNAL, port.toSendPort()); | 201 replyTo.send(_SPAWNED_SIGNAL, port.toSendPort()); |
| 176 isolate._run(port); | 202 isolate._run(port); |
| 177 } | 203 } |
| 178 | 204 |
| 179 static SendPort _toSendPort(port) native { | |
| 180 return port.toSendPort(); | |
| 181 } | |
| 182 | |
| 183 static void _print(String msg) native { | 205 static void _print(String msg) native { |
| 184 print(msg); | 206 print(msg); |
| 185 } | 207 } |
| 186 | 208 |
| 187 static _copyObject(obj) native { | 209 static _copyObject(obj) native { |
| 188 return new Copier().traverse(obj); | 210 return new Copier().traverse(obj); |
| 189 } | 211 } |
| 190 | 212 |
| 191 static _serializeObject(obj) native { | 213 static _serializeObject(obj) native { |
| 192 return new Serializer().traverse(obj); | 214 return new Serializer().traverse(obj); |
| 193 } | 215 } |
| 194 | 216 |
| 195 static _deserializeMessage(message) native { | 217 static _deserializeMessage(message) native { |
| 196 return new Deserializer().deserialize(message); | 218 return new Deserializer().deserialize(message); |
| 197 } | 219 } |
| 198 } | 220 } |
| OLD | NEW |