| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| patch class _IOService { |
| // Lazy initialize service ports, 32 per isolate. |
| static const int _SERVICE_PORT_COUNT = 32; |
| static List<SendPort> _servicePort = new List(_SERVICE_PORT_COUNT); |
| static RawReceivePort _receivePort; |
| static SendPort _replyToPort; |
| static Map<int, Completer> _messageMap = {}; |
| static int _id = 0; |
| |
| /* patch */ static Future _dispatch(int request, List data) { |
| int id; |
| do { |
| id = _getNextId(); |
| } while (_messageMap.containsKey(id)); |
| int index = id % _SERVICE_PORT_COUNT; |
| _initialize(index); |
| var completer = new Completer(); |
| _messageMap[id] = completer; |
| try { |
| _servicePort[index].send([id, _replyToPort, request, data]); |
| } catch (error) { |
| _messageMap.remove(id).complete(error); |
| if (_messageMap.length == 0) { |
| _finalize(); |
| } |
| } |
| return completer.future; |
| } |
| |
| static void _initialize(int index) { |
| if (_servicePort[index] == null) { |
| _servicePort[index] = _newServicePort(); |
| } |
| if (_receivePort == null) { |
| _receivePort = new RawReceivePort(); |
| _replyToPort = _receivePort.sendPort; |
| _receivePort.handler = (data) { |
| assert(data is List && data.length == 2); |
| _messageMap.remove(data[0]).complete(data[1]); |
| if (_messageMap.length == 0) { |
| _finalize(); |
| } |
| }; |
| } |
| } |
| |
| static void _finalize() { |
| _id = 0; |
| _receivePort.close(); |
| _receivePort = null; |
| } |
| |
| static int _getNextId() { |
| if (_id == 0x7FFFFFFF) _id = 0; |
| return _id++; |
| } |
| |
| static SendPort _newServicePort() native "IOService_NewServicePort"; |
| } |