fixed: MacOS OVM debugger
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 Dec 2023 05:03:34 +0000 (23:03 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 Dec 2023 05:03:34 +0000 (23:03 -0600)
Using `sem_open`, better debug socket path

compiler/src/wasm_runtime.c
core/runtime/common.onyx
core/threads/thread.onyx
interpreter/include/ovm_debug.h
interpreter/src/debug/debug_host.c
interpreter/src/debug/debug_thread.c
interpreter/src/vm/vm.c

index 973ecc945ac23ce93b01c92c53877e5ddf770826..0608f91b926bacb971205f888218c4409e251dbf 100644 (file)
@@ -563,6 +563,14 @@ void onyx_run_initialize(b32 debug_enabled) {
 #ifdef USE_OVM_DEBUGGER
     void wasm_config_enable_debug(wasm_config_t *config, int value);
     wasm_config_enable_debug(wasm_config, debug_enabled);
+
+    #if defined(_BH_LINUX) || defined(_BH_DARWIN)
+        char *env_path = getenv("ONYX_PATH");
+        char *socket_path = bh_aprintf(bh_heap_allocator(), "%s/debug.0000", env_path);
+
+        void wasm_config_set_listen_path(wasm_config_t *config, char *listen_path);
+        wasm_config_set_listen_path(wasm_config, socket_path);
+    #endif
 #endif
 
 #ifndef USE_OVM_DEBUGGER
index 471b0a38fb98b7a80d033a78fb4a87f010db90dd..4d3e6446f41a86d6d9f2686e34472f293d3345e1 100644 (file)
@@ -120,10 +120,12 @@ __thread_initialize :: () {
         func(data);
 
         __flush_stdio();
+
+        core.thread.__exited(id);
     }
 
     _thread_exit :: (id: i32) {
-        raw_free(alloc.heap_allocator, __tls_base);
-        core.thread.__exited(id);
+        // raw_free(alloc.heap_allocator, __tls_base);
+        // core.thread.__exited(id);
     }
 }
index c9a5e11496d8178d3927f77ea72b0fdd68689a18..079f2057211a2e2f2354e856e845085d2e9a428c 100644 (file)
@@ -91,7 +91,7 @@ __initialize :: () {
 __exited :: (id: i32) {
     sync.scoped_mutex(&thread_mutex);
 
-    thread := thread_map->get(id)?;
+    thread := thread_map->get(id) ?? null;
     if thread != null {
         thread.alive = false;
         #if runtime.platform.Supports_Futexes {
index 366b659f4b5c1a73ddb960566d5986182cb39ec4..91ff48a2955caa01b4bda633befc211ac2eb9bbc 100644 (file)
@@ -275,7 +275,7 @@ typedef struct debug_thread_state_t {
     b32 started;
 
     i32 run_count;
-    sem_t wait_semaphore;
+    sem_t* wait_semaphore;
 
     bool pause_at_next_line;
     i32 pause_within;
index 505abdb24509bf98091fc907fba5c6800622bdca..8fc185233494973734ea39dd332bd18ba37dd989 100644 (file)
@@ -43,11 +43,14 @@ u32 debug_host_register_thread(debug_state_t *debug, ovm_state_t *ovm_state) {
     new_thread->state = debug_state_starting;
     new_thread->ovm_state = ovm_state;
     new_thread->run_count = 0;                    // Start threads in stopped state.
-    sem_init(&new_thread->wait_semaphore, 0, 0);
 
     u32 id = debug->next_thread_id++;
     new_thread->id = id;
 
+    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->state_change_write_fd = debug->state_change_pipes[1];
 
     bh_arr_push(debug->threads, new_thread);
index 7e6fb2b3b390d8010d7f7d929c41157c0f85381a..4ce7091510de9c0bc9fe1a5815ce4feb43ba0b5d 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);
+    sem_post(thread->wait_semaphore);
 }
 
 static void resume_thread_slow(debug_thread_state_t *thread) {
-    sem_post(&thread->wait_semaphore);
+    sem_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) {
@@ -577,7 +577,7 @@ void *__debug_thread_entry(void * data) {
     local_addr.sun_family = AF_UNIX;
     strcpy(local_addr.sun_path, debug->listen_path); // TODO: Make this dynamic so mulitple servers can exist at a time.
     unlink(local_addr.sun_path);                     // TODO: Remove this line for the same reason.
-    int len = strlen(local_addr.sun_path) + sizeof(local_addr.sun_family);
+    int len = strlen(local_addr.sun_path) + 1 + sizeof(local_addr.sun_family);
     bind(debug->listen_socket_fd, (struct sockaddr *)&local_addr, len);
 
     //
index 4e98f756f8df32b9ddf05d610e1973c4017e507a..27cfde8d96e7653c9a49aaab8bdd0d3bfb9b6a18 100644 (file)
@@ -460,7 +460,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);
+        sem_wait(state->debug->wait_semaphore);
     }
 }
 
@@ -515,7 +515,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);
+    sem_wait(state->debug->wait_semaphore);
     state->debug->state = debug_state_running;
 
     shouldnt_wait: