From 83fea976d887b0b9cdf3868a376cc21fe5a28ad9 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 13 Dec 2023 23:03:34 -0600 Subject: [PATCH] fixed: MacOS OVM debugger Using `sem_open`, better debug socket path --- compiler/src/wasm_runtime.c | 8 ++++++++ core/runtime/common.onyx | 6 ++++-- core/threads/thread.onyx | 2 +- interpreter/include/ovm_debug.h | 2 +- interpreter/src/debug/debug_host.c | 5 ++++- interpreter/src/debug/debug_thread.c | 6 +++--- interpreter/src/vm/vm.c | 4 ++-- 7 files changed, 23 insertions(+), 10 deletions(-) diff --git a/compiler/src/wasm_runtime.c b/compiler/src/wasm_runtime.c index 973ecc94..0608f91b 100644 --- a/compiler/src/wasm_runtime.c +++ b/compiler/src/wasm_runtime.c @@ -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 diff --git a/core/runtime/common.onyx b/core/runtime/common.onyx index 471b0a38..4d3e6446 100644 --- a/core/runtime/common.onyx +++ b/core/runtime/common.onyx @@ -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); } } diff --git a/core/threads/thread.onyx b/core/threads/thread.onyx index c9a5e114..079f2057 100644 --- a/core/threads/thread.onyx +++ b/core/threads/thread.onyx @@ -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 { diff --git a/interpreter/include/ovm_debug.h b/interpreter/include/ovm_debug.h index 366b659f..91ff48a2 100644 --- a/interpreter/include/ovm_debug.h +++ b/interpreter/include/ovm_debug.h @@ -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; diff --git a/interpreter/src/debug/debug_host.c b/interpreter/src/debug/debug_host.c index 505abdb2..8fc18523 100644 --- a/interpreter/src/debug/debug_host.c +++ b/interpreter/src/debug/debug_host.c @@ -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); diff --git a/interpreter/src/debug/debug_thread.c b/interpreter/src/debug/debug_thread.c index 7e6fb2b3..4ce70915 100644 --- a/interpreter/src/debug/debug_thread.c +++ b/interpreter/src/debug/debug_thread.c @@ -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); // diff --git a/interpreter/src/vm/vm.c b/interpreter/src/vm/vm.c index 4e98f756..27cfde8d 100644 --- a/interpreter/src/vm/vm.c +++ b/interpreter/src/vm/vm.c @@ -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: -- 2.25.1