// Copyright (c) 2016, 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.

#if defined(DART_IO_DISABLED)

#include "bin/process.h"

#include "bin/builtin.h"
#include "bin/dartutils.h"
#include "include/dart_api.h"

namespace dart {
namespace bin {

int Process::global_exit_code_ = 0;
Mutex* Process::global_exit_code_mutex_ = new Mutex();
Process::ExitHook Process::exit_hook_ = NULL;

void Process::TerminateExitCodeHandler() {}


void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_KillPid)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_Exit)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_SetExitCode)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_GetExitCode)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_Pid)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_SetSignalHandler)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(Process_ClearSignalHandler)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(SystemEncodingToString)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}


void FUNCTION_NAME(StringToSystemEncoding)(Dart_NativeArguments args) {
  Dart_ThrowException(
      DartUtils::NewInternalError("Process is not supported on this platform"));
}

}  // namespace bin
}  // namespace dart

#endif  // !defined(DART_IO_DISABLED)
