blob: add622f8f3d9deb4342b6e0de40e5485414c1b4d [file] [log] [blame]
// 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";
}