| // 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. |
| |
| #include "bin/native_service.h" |
| |
| #include "platform/globals.h" |
| #include "bin/thread.h" |
| |
| |
| namespace dart { |
| namespace bin { |
| |
| NativeService::NativeService(const char* name, |
| Dart_NativeMessageHandler handler, |
| int number_of_ports) |
| : name_(name), |
| handler_(handler), |
| service_ports_size_(number_of_ports), |
| service_ports_index_(0) { |
| service_ports_ = new Dart_Port[service_ports_size_]; |
| for (int i = 0; i < service_ports_size_; i++) { |
| service_ports_[i] = ILLEGAL_PORT; |
| } |
| } |
| |
| |
| NativeService::~NativeService() { |
| delete[] service_ports_; |
| } |
| |
| |
| Dart_Port NativeService::GetServicePort() { |
| MutexLocker lock(&mutex_); |
| Dart_Port result = service_ports_[service_ports_index_]; |
| if (result == ILLEGAL_PORT) { |
| result = Dart_NewNativePort(name_, handler_, true); |
| ASSERT(result != ILLEGAL_PORT); |
| service_ports_[service_ports_index_] = result; |
| } |
| service_ports_index_ = (service_ports_index_ + 1) % service_ports_size_; |
| return result; |
| } |
| |
| } // namespace bin |
| } // namespace dart |