// 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.

#ifndef BIN_NATIVE_SERVICE_H_
#define BIN_NATIVE_SERVICE_H_

#include "include/dart_api.h"
#include "include/dart_native_api.h"
#include "platform/globals.h"
#include "platform/thread.h"


namespace dart {
namespace bin {

// Utility class to set up a native service and allocate Dart native
// ports to interact with it from Dart code. The number of native ports
// allocated for each service is limited.
class NativeService {
 public:
  // Create a native service with the given name and handler. Allow
  // the creation of [number_of_ports] native ports for the service.
  // If GetServicePort is called more than [number_of_ports] times
  // one of the already allocated native ports will be reused.
  NativeService(const char* name,
                Dart_NativeMessageHandler handler,
                int number_of_ports);

  ~NativeService();

  // Get a Dart native port for this native service.
  Dart_Port GetServicePort();

 private:
  // Name and handler for the native service.
  const char* name_;
  Dart_NativeMessageHandler handler_;

  // Allocated native ports for the service. Mutex protected since
  // the service can be used from multiple isolates.
  dart::Mutex mutex_;
  int service_ports_size_;
  Dart_Port* service_ports_;
  int service_ports_index_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(NativeService);
};

}  // namespace bin
}  // namespace dart

#endif  // BIN_NATIVE_SERVICE_H_
