improve debugger support on mac
authorJudah Caruso <judah@tuta.io>
Fri, 15 Dec 2023 02:04:52 +0000 (19:04 -0700)
committerJudah Caruso <judah@tuta.io>
Fri, 15 Dec 2023 02:04:52 +0000 (19:04 -0700)
interpreter/include/ovm_debug.h
interpreter/src/debug/debug_host.c
interpreter/src/debug/debug_thread.c
interpreter/src/vm/vm.c

index 91ff48a2955caa01b4bda633befc211ac2eb9bbc..4a343a03ce5cf267349ad80172464c216a23a211 100644 (file)
@@ -2,9 +2,46 @@
 #define _OVM_DEBUG_H
 
 #include "bh.h"
-#include <semaphore.h>
 #include <stdbool.h>
 
+#if defined(_BH_LINUX)
+    #include <semaphore.h>
+
+    typedef dispatch_semaphore_t semaphore;
+
+    static inline semaphore* semaphore_create(const char *name, int oflag, mode_t mode, unsigned int value) {
+        return sem_open(name, flags, mode, value);
+    }
+
+    static inline void semaphore_wait(semaphore* sem) {
+        sem_wait(sem);
+    }
+
+    static inline void semaphore_post(semaphore* sem) {
+        sem_post(sem);
+    }
+#elif defined(_BH_DARWIN)
+    #include <dispatch/dispatch.h>
+
+    typedef dispatch_semaphore_t semaphore;
+
+    static inline semaphore* semaphore_create(const char *name, int oflag, mode_t mode, unsigned int value) {
+        semaphore* sem = bh_alloc(bh_heap_allocator(), sizeof(semaphore));
+        *sem = dispatch_semaphore_create(value);
+        return sem;
+    }
+
+    static inline void semaphore_wait(semaphore* sem) {
+        dispatch_semaphore_wait(*sem, DISPATCH_TIME_FOREVER);
+    }
+
+    static inline void semaphore_post(semaphore* sem) {
+        dispatch_semaphore_signal(*sem);
+    }
+#else
+    #error "Unsupported platform"
+#endif
+
 typedef struct debug_loc_info_t {
     u32 file_id;
     u32 line;
@@ -275,7 +312,7 @@ typedef struct debug_thread_state_t {
     b32 started;
 
     i32 run_count;
-    sem_t* wait_semaphore;
+    semaphore* wait_semaphore;
 
     bool pause_at_next_line;
     i32 pause_within;
index 8fc185233494973734ea39dd332bd18ba37dd989..163ff89eeb21fb0269ff2ec9f6a6145c148a496b 100644 (file)
@@ -49,7 +49,7 @@ u32 debug_host_register_thread(debug_state_t *debug, ovm_state_t *ovm_state) {
 
     char name_buf[256];
     bh_bprintf(name_buf, 256, "/ovm_thread_%d", new_thread->id);
-    new_thread->wait_semaphore = sem_open(name_buf, O_CREAT, 0664, 0);
+    new_thread->wait_semaphore = semaphore_create(name_buf, O_CREAT, 0664, 0);
 
     new_thread->state_change_write_fd = debug->state_change_pipes[1];
 
index 4ce7091510de9c0bc9fe1a5815ce4feb43ba0b5d..867f9ef560ce3df7b40feaff20f103ec8238746f 100644 (file)
@@ -92,11 +92,11 @@ static char *parse_string(debug_state_t *debug, struct msg_parse_ctx_t *ctx) {
 
 static void resume_thread(debug_thread_state_t *thread) {
     thread->run_count = -1;
-    sem_post(thread->wait_semaphore);
+    semaphore_post(thread->wait_semaphore);
 }
 
 static void resume_thread_slow(debug_thread_state_t *thread) {
-    sem_post(thread->wait_semaphore);
+    semaphore_post(thread->wait_semaphore);
 }
 
 static u32 get_stack_frame_instruction_pointer(debug_state_t *debug, debug_thread_state_t *thread, ovm_stack_frame_t *frame) {
index 27cfde8d96e7653c9a49aaab8bdd0d3bfb9b6a18..e959c62a57fdc93ecbd1e39e1212cd1b9c99c0fd 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <sys/mman.h>
 #include <signal.h>
+
 #if defined(__arm64__)
     #include <arm_neon.h>
 #elif defined(__x86_64__)
@@ -460,7 +461,7 @@ static void __ovm_trigger_exception(ovm_state_t *state) {
         state->debug->pause_reason = debug_pause_exception;
 
         assert(write(state->debug->state_change_write_fd, "1", 1));
-        sem_wait(state->debug->wait_semaphore);
+        semaphore_wait(state->debug->wait_semaphore);
     }
 }
 
@@ -515,7 +516,7 @@ static void __ovm_debug_hook(ovm_engine_t *engine, ovm_state_t *state) {
 
     should_wait:
     assert(write(state->debug->state_change_write_fd, "1", 1));
-    sem_wait(state->debug->wait_semaphore);
+    semaphore_wait(state->debug->wait_semaphore);
     state->debug->state = debug_state_running;
 
     shouldnt_wait: