working on support for MacOS in onyx runtime
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 16 Nov 2023 17:02:44 +0000 (11:02 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 16 Nov 2023 17:02:44 +0000 (11:02 -0600)
compiler/src/wasm_runtime.c
runtime/onyx_runtime.c
runtime/src/ort_directories.h
runtime/src/ort_files.h
runtime/src/ort_os.h
runtime/src/ort_processes.h
runtime/src/ort_threads.h
runtime/src/ort_tty.h
shared/include/onyx_library.h

index d423d01a8cc18f38fd924a3e6579b04e94f8063f..9a78ce2f954affa2f526dcd0ff12d6740777815b 100644 (file)
@@ -14,7 +14,7 @@
     #include "wasmer.h"
 #endif
 
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
     #include <pthread.h>
     #include <signal.h>
     #include <sys/wait.h>
@@ -80,7 +80,7 @@ typedef struct LinkLibraryContext {
 
 
 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;
@@ -108,6 +108,10 @@ static void *locate_symbol_in_dynamic_library(LinkLibraryContext *ctx, char *lib
     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
@@ -118,7 +122,7 @@ static void *locate_symbol_in_dynamic_library(LinkLibraryContext *ctx, char *lib
 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
index e756e25378cbb3acbb859a2b1cc91c51581692b5..5847a6e46c533e952cc8a7d4ce120d1b8d0f847f 100644 (file)
@@ -6,7 +6,7 @@
 #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>
@@ -36,7 +36,7 @@
 #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
 
index 3cc8d355fd2df7b469629a5464660490ca4ca06b..c067a30981f67c71cfd10e0441f22992025d1c2e 100644 (file)
@@ -28,7 +28,7 @@ ONYX_DEF(__dir_open, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
     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);
@@ -65,7 +65,7 @@ ONYX_DEF(__dir_read, (WASM_I64, WASM_I32), (WASM_I32)) {
     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);
@@ -118,7 +118,7 @@ ONYX_DEF(__dir_close, (WASM_I64), ()) {
     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;
 
@@ -141,7 +141,7 @@ ONYX_DEF(__dir_create, (WASM_I32, WASM_I32), (WASM_I32)) {
     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
@@ -161,7 +161,7 @@ ONYX_DEF(__dir_remove, (WASM_I32, WASM_I32), (WASM_I32)) {
     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
index de6e3e0b72c43767c161c9acb9860d8b32669e4f..148454e6a84a43e8e67e1bbfbb543ddf0b7ca0ed 100644 (file)
@@ -204,7 +204,7 @@ ONYX_DEF(__file_rename, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
     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
index 403f5b7017ebb2090940c60350112ddd15ac48c3..93954a838889eab0c74c30ce851555ffa2f9ce26 100644 (file)
@@ -38,7 +38,7 @@ ONYX_DEF(__exit, (WASM_I32), ()) {
 }
 
 ONYX_DEF(__sleep, (WASM_I32), ()) {
-    #ifdef _BH_LINUX
+    #if defined(_BH_LINUX) || defined(_BH_DARWIN)
     usleep(params->data[0].of.i32 * 1000);
     #endif
 
@@ -56,7 +56,7 @@ ONYX_DEF(__time, (), (WASM_I64)) {
 // ([] 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++) {
@@ -102,7 +102,7 @@ ONYX_DEF(__poll, (WASM_I32, WASM_I32, WASM_I32), ()) {
 
 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);
@@ -131,7 +131,7 @@ ONYX_DEF(__lookup_env, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_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
 
@@ -149,7 +149,7 @@ ONYX_DEF(__random_get, (WASM_PTR, WASM_I32), ()) {
 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;
@@ -181,7 +181,7 @@ ONYX_DEF(__futex_wait, (WASM_PTR, WASM_I32, WASM_I32), (WASM_I32)) {
 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);
@@ -200,7 +200,7 @@ ONYX_DEF(__futex_wake, (WASM_PTR, WASM_I32), (WASM_I32)) {
 
 
 
-#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) {
@@ -211,7 +211,7 @@ 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];
index 600deca1c09bfe8be284f167cb4ddd191b813076..d4fa11200498ce08fdf77af8c15e7374d72bcff3 100644 (file)
@@ -7,7 +7,7 @@
 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];
@@ -50,7 +50,7 @@ ONYX_DEF(__process_spawn, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WAS
     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);
@@ -198,7 +198,7 @@ ONYX_DEF(__process_read, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
     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) {
@@ -232,7 +232,7 @@ ONYX_DEF(__process_write, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
     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
@@ -253,7 +253,7 @@ ONYX_DEF(__process_kill, (WASM_I64), (WASM_I32)) {
         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
@@ -273,7 +273,7 @@ ONYX_DEF(__process_wait, (WASM_I64), (WASM_I32)) {
         return NULL;
     }
 
-    #ifdef _BH_LINUX
+    #if defined(_BH_LINUX) || defined(_BH_DARWIN)
         i32 status;
         waitpid(process->pid, &status, 0);
 
@@ -330,7 +330,7 @@ ONYX_DEF(__process_destroy, (WASM_I64), ()) {
         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
index c58114d63ccfd0a5136f7f7d0d578f5cdbe3c781..92cc35a5cdf4e472482e42a6db5c29e7730f1b06 100644 (file)
@@ -11,7 +11,7 @@ typedef struct OnyxThread {
     i32 dataptr;
     wasm_instance_t* instance;
 
-    #ifdef _BH_LINUX
+    #if defined(_BH_LINUX) || defined(_BH_DARWIN)
         pthread_t thread;
     #endif
 
@@ -23,7 +23,7 @@ typedef struct OnyxThread {
 
 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
@@ -94,7 +94,7 @@ ONYX_DEF(__spawn_thread, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM
     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
 
@@ -113,7 +113,7 @@ ONYX_DEF(__kill_thread, (WASM_I32), (WASM_I32)) {
     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);
index 2bbf6b1ee12a9a9b9b88acd4b75c519ba4803190..12dce9d8c915c9554480fa4f3ddf5436a918035d 100644 (file)
@@ -8,7 +8,7 @@ struct Onyx_TTY_State {
 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;
@@ -40,7 +40,7 @@ ONYX_DEF(__tty_get, (WASM_I32), ()) {
 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;
index eb5c3ce4da4786f8b55f906081d6bd0d5783297a..41789a7a08ee395c5dd243b0957225fbb4a93d60 100644 (file)
@@ -8,7 +8,7 @@
     #define ONYX_IMPORT extern __declspec(dllimport)
 #endif
 
-#if defined(__unix__)
+#if defined(__unix__) || defined(__APPLE__)
     #define ONYX_EXPORT
     #define ONYX_IMPORT
 #endif