#include "wasmer.h"
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
#include <pthread.h>
#include <signal.h>
#include <sys/wait.h>
static void *locate_symbol_in_dynamic_library_raw(char *libname, char *sym) {
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
void* handle = dlopen(libname, RTLD_LAZY);
if (handle == NULL) {
return NULL;
library_name = bh_lookup_file(libname, ".", ".so", 1, (const char **) ctx->library_paths, 1);
#endif
+ #ifdef _BH_DARWIN
+ library_name = bh_lookup_file(libname, ".", ".dylib", 1, (const char **) ctx->library_paths, 1);
+ #endif
+
#ifdef _BH_WINDOWS
library_name = bh_lookup_file(libname, ".", ".dll", 1, (const char **) ctx->library_paths, 1);
#endif
typedef void *(*LinkLibraryer)(OnyxRuntime *runtime);
static WasmFuncDefinition** onyx_load_library(LinkLibraryContext *ctx, char *name) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
#define DIR_SEPARATOR '/'
#endif
#ifdef _BH_WINDOWS
#define ONYX_NO_SHORT_NAMES
#include "onyx_library.h"
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
#include <pthread.h>
#include <signal.h>
#include <sys/wait.h>
#include "src/ort_cptr.h"
#include "src/ort_tty.h"
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
#include "src/ort_net_linux.h"
#endif
return NULL;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
DIR* dir = opendir(path);
*(u64 *) ONYX_PTR(params->data[2].of.i32) = (u64) dir;
results->data[0] = WASM_I32_VAL(dir != NULL);
return NULL;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
DIR* dir = (DIR *) params->data[0].of.i64;
if (dir == NULL) {
results->data[0] = WASM_I32_VAL(0);
return NULL;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
DIR* dir = (DIR *) params->data[0].of.i64;
if (dir == NULL) return NULL;
return NULL;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
results->data[0] = WASM_I32_VAL(mkdir(path, 0777) == 0);
return NULL;
#endif
return NULL;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
results->data[0] = WASM_I32_VAL(rmdir(path) == 0);
return NULL;
#endif
return NULL;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
results->data[0] = WASM_I32_VAL(rename(old_path, new_path) == 0);
return NULL;
#endif
}
ONYX_DEF(__sleep, (WASM_I32), ()) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
usleep(params->data[0].of.i32 * 1000);
#endif
// ([] PollDescription, timeout: i32) -> void
// PollDescription :: struct { fd: i64; in_event: PollEvent; out_event: PollEvent; }
ONYX_DEF(__poll, (WASM_I32, WASM_I32, WASM_I32), ()) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
struct pollfd* fds = alloca(params->data[1].of.i32 * sizeof(struct pollfd));
for (int i=0; i < params->data[1].of.i32; i++) {
ONYX_DEF(__lookup_env, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
char *key_ptr = ONYX_PTR(params->data[0].of.i32);
int key_len = params->data[1].of.i32;
char *out_ptr = ONYX_PTR(params->data[2].of.i32);
ONYX_DEF(__random_get, (WASM_PTR, WASM_I32), ()) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
getrandom(ONYX_PTR(params->data[0].of.i32), params->data[1].of.i32, 0);
#endif
ONYX_DEF(__futex_wait, (WASM_PTR, WASM_I32, WASM_I32), (WASM_I32)) {
int *addr = ONYX_PTR(params->data[0].of.i32);
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
struct timespec delay;
struct timespec *t = NULL;
ONYX_DEF(__futex_wake, (WASM_PTR, WASM_I32), (WASM_I32)) {
int *addr = ONYX_PTR(params->data[0].of.i32);
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
int res = syscall(SYS_futex, addr, FUTEX_WAKE, params->data[1].of.i32, NULL, NULL, 0);
results->data[0] = WASM_I32_VAL(res);
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
static wasm_func_t *wasm_cleanup_func;
static void unix_signal_handler(int signo, siginfo_t *info, void *context) {
#endif
ONYX_DEF(__register_cleanup, (WASM_I32, WASM_I32), (WASM_I32)) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
int len = (127 < params->data[1].of.i32 ? 127 : params->data[1].of.i32);
char name[128];
typedef struct OnyxProcess {
u64 magic_number;
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
// Pipes
i32 proc_to_host[2];
i32 host_to_proc[2];
memset(process, 0, sizeof(*process));
process->magic_number = ONYX_PROCESS_MAGIC_NUMBER;
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
// :Security - alloca a user controlled string.
char **process_args = alloca(sizeof(char *) * (args_len + 2));
byte_t* array_loc = ONYX_PTR(args_ptr);
u8 *buffer = ONYX_PTR(output_ptr);
i32 bytes_read;
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
bytes_read = read(process->proc_to_host[0], buffer, output_len);
if (bytes_read < 0) {
switch (errno) {
u8 *buffer = ONYX_PTR(input_ptr);
i32 bytes_written;
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
bytes_written = write(process->host_to_proc[1], buffer, input_len);
bytes_written = bh_max(bytes_written, 0); // Silently consume errors
#endif
return NULL;
}
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
i32 failed = kill(process->pid, SIGKILL);
results->data[0] = WASM_I32_VAL(!failed);
#endif
return NULL;
}
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
i32 status;
waitpid(process->pid, &status, 0);
return NULL;
}
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
close(process->proc_to_host[0]);
close(process->host_to_proc[1]);
#endif
i32 dataptr;
wasm_instance_t* instance;
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
pthread_t thread;
#endif
static bh_arr(OnyxThread) threads = NULL;
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
static void *onyx_run_thread(void *data) {
#endif
#ifdef _BH_WINDOWS
thread->closureptr = params->data[4].of.i32;
thread->dataptr = params->data[6].of.i32;
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
pthread_create(&thread->thread, NULL, onyx_run_thread, thread);
#endif
i32 i = 0;
bh_arr_each(OnyxThread, thread, threads) {
if (thread->id == thread_id) {
- #ifdef _BH_LINUX
+ #if defined(_BH_LINUX) || defined(_BH_DARWIN)
// This leads to some weirdness and bugs...
//
// pthread_kill(thread->thread, SIGKILL);
ONYX_DEF(__tty_get, (WASM_I32), ()) {
struct Onyx_TTY_State *state = ONYX_PTR(params->data[0].of.i32);
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
struct winsize sz;
ioctl(0, TIOCGWINSZ, &sz);
state->rows = sz.ws_row;
ONYX_DEF(__tty_set, (WASM_I32), (WASM_I32)) {
struct Onyx_TTY_State *state = ONYX_PTR(params->data[0].of.i32);
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
int success = 1;
struct termios term;
#define ONYX_IMPORT extern __declspec(dllimport)
#endif
-#if defined(__unix__)
+#if defined(__unix__) || defined(__APPLE__)
#define ONYX_EXPORT
#define ONYX_IMPORT
#endif