// 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";
}
