packages feed

moonlight-triangulation-1.0.1.0: cbits/moonlight_runtime.c

#include "moonlight_triangulation.h"
#include "HsFFI.h"

#if defined(_WIN32)
#include <windows.h>

static INIT_ONCE moonlight_runtime_once = INIT_ONCE_STATIC_INIT;

static BOOL CALLBACK moonlight_initialize_runtime(PINIT_ONCE once, PVOID parameter, PVOID *context) {
  int argc = 1;
  char program_name[] = "moonlight-triangulation";
  char *argv[] = {program_name, NULL};
  char **argv_pointer = argv;
  (void)once;
  (void)parameter;
  (void)context;
  hs_init(&argc, &argv_pointer);
  return TRUE;
}

ML_API ml_status ml_runtime_initialize(void) {
  return InitOnceExecuteOnce(&moonlight_runtime_once, moonlight_initialize_runtime, NULL, NULL)
    ? ML_STATUS_OK
    : ML_STATUS_RUNTIME_FAILURE;
}
#else
#include <pthread.h>

static pthread_once_t moonlight_runtime_once = PTHREAD_ONCE_INIT;

static void moonlight_initialize_runtime(void) {
  int argc = 1;
  char program_name[] = "moonlight-triangulation";
  char *argv[] = {program_name, NULL};
  char **argv_pointer = argv;
  hs_init(&argc, &argv_pointer);
}

ML_API ml_status ml_runtime_initialize(void) {
  return pthread_once(&moonlight_runtime_once, moonlight_initialize_runtime) == 0
    ? ML_STATUS_OK
    : ML_STATUS_RUNTIME_FAILURE;
}
#endif

ML_API uint32_t ml_abi_version(void) {
  return 1;
}