From e696ac36d7bab05d749fe567ff53a2ca222b5e69 Mon Sep 17 00:00:00 2001 From: Xu Jun <693788454@qq.com> Date: Tue, 17 Jan 2023 08:45:29 +0800 Subject: [PATCH] Fix potential block issue in source debugger (#1887) Fix issue reported in #1860 --- core/iwasm/interpreter/wasm_interp_classic.c | 3 --- .../libraries/thread-mgr/thread_manager.c | 18 +++++++++++------- .../libraries/thread-mgr/thread_manager.h | 3 --- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index 46c5ff44..1077910f 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1041,7 +1041,6 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, } \ if (IS_WAMR_STOP_SIG(exec_env->current_status->signal_flag)) { \ SYNC_ALL_TO_FRAME(); \ - wasm_cluster_thread_stopped(exec_env); \ wasm_cluster_thread_waiting_run(exec_env); \ } \ } while (0) @@ -1077,7 +1076,6 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, && exec_env->current_status->step_count++ == 1) { \ exec_env->current_status->step_count = 0; \ SYNC_ALL_TO_FRAME(); \ - wasm_cluster_thread_stopped(exec_env); \ wasm_cluster_thread_waiting_run(exec_env); \ } \ goto *handle_table[*frame_ip++]; \ @@ -1094,7 +1092,6 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, && exec_env->current_status->step_count++ == 2) { \ exec_env->current_status->step_count = 0; \ SYNC_ALL_TO_FRAME(); \ - wasm_cluster_thread_stopped(exec_env); \ wasm_cluster_thread_waiting_run(exec_env); \ } \ continue diff --git a/core/iwasm/libraries/thread-mgr/thread_manager.c b/core/iwasm/libraries/thread-mgr/thread_manager.c index 4408b013..e307dd61 100644 --- a/core/iwasm/libraries/thread-mgr/thread_manager.c +++ b/core/iwasm/libraries/thread-mgr/thread_manager.c @@ -609,17 +609,17 @@ notify_debug_instance_exit(WASMExecEnv *exec_env) on_thread_exit_event(cluster->debug_inst, exec_env); } -void -wasm_cluster_thread_stopped(WASMExecEnv *exec_env) -{ - exec_env->current_status->running_status = STATUS_STOP; - notify_debug_instance(exec_env); -} - void wasm_cluster_thread_waiting_run(WASMExecEnv *exec_env) { os_mutex_lock(&exec_env->wait_lock); + + /* Wake up debugger thread after we get the lock, otherwise we may miss the + * signal from debugger thread, see + * https://github.com/bytecodealliance/wasm-micro-runtime/issues/1860 */ + exec_env->current_status->running_status = STATUS_STOP; + notify_debug_instance(exec_env); + while (!wasm_cluster_thread_is_running(exec_env)) { os_cond_wait(&exec_env->wait_cond, &exec_env->wait_lock); } @@ -646,16 +646,20 @@ wasm_cluster_thread_exited(WASMExecEnv *exec_env) void wasm_cluster_thread_continue(WASMExecEnv *exec_env) { + os_mutex_lock(&exec_env->wait_lock); wasm_cluster_clear_thread_signal(exec_env); exec_env->current_status->running_status = STATUS_RUNNING; os_cond_signal(&exec_env->wait_cond); + os_mutex_unlock(&exec_env->wait_lock); } void wasm_cluster_thread_step(WASMExecEnv *exec_env) { + os_mutex_lock(&exec_env->wait_lock); exec_env->current_status->running_status = STATUS_STEP; os_cond_signal(&exec_env->wait_cond); + os_mutex_unlock(&exec_env->wait_lock); } void diff --git a/core/iwasm/libraries/thread-mgr/thread_manager.h b/core/iwasm/libraries/thread-mgr/thread_manager.h index c84d3c02..5519960c 100644 --- a/core/iwasm/libraries/thread-mgr/thread_manager.h +++ b/core/iwasm/libraries/thread-mgr/thread_manager.h @@ -166,9 +166,6 @@ wasm_cluster_destroy_exenv_status(WASMCurrentEnvStatus *status); void wasm_cluster_send_signal_all(WASMCluster *cluster, uint32 signo); -void -wasm_cluster_thread_stopped(WASMExecEnv *exec_env); - void wasm_cluster_thread_waiting_run(WASMExecEnv *exec_env);