packages feed

moonlight-triangulation-1.4.0.1: cbits/moonlight_runtime.c

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

_Static_assert(ML_OBSTRUCTION_REFINEMENT_MAXIMUM_EDGE_LENGTH_NOT_FINITE == 60, "maximum-edge ABI code drift");
_Static_assert(ML_OBSTRUCTION_REFINEMENT_MAXIMUM_EDGE_LENGTH_NOT_POSITIVE == 61, "maximum-edge ABI code drift");
_Static_assert(ML_OBSTRUCTION_REFINEMENT_OVERSIZED_EDGE == 62, "maximum-edge ABI code drift");
_Static_assert(ML_OBSTRUCTION_REFINEMENT_SEAM_BRIDGE_BUDGET_EXCEEDED == 63, "seam-bridge ABI code drift");
_Static_assert(ML_OBSTRUCTION_REFINEMENT_SEAM_BRIDGE_MIDPOINT_COLLAPSED == 64, "seam-bridge ABI code drift");
_Static_assert(ML_OBSTRUCTION_BOUNDARY_SPLIT_REQUIRES_BOUNDARY_EDGE == 65, "boundary-split ABI code drift");

#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 2;
}