Move exception lock to ModuleInstance data.

This lock acquired on each native function call. This cause performance impact
on programs, containing many native function calls, and running in multithreaded environment.
This commit is contained in:
Vyacheslav Chigrin 2025-12-23 20:07:30 +03:00
parent 2a2dd19f32
commit e8b2c51b48
4 changed files with 24 additions and 15 deletions

View File

@ -1962,6 +1962,12 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent,
module_inst->module = (void *)module;
module_inst->e =
(WASMModuleInstanceExtra *)((uint8 *)module_inst + extra_info_offset);
#if WASM_ENABLE_THREAD_MGR != 0
if (os_mutex_init(&module_inst->e->common.exception_lock) != 0) {
wasm_runtime_free(module_inst);
return NULL;
}
#endif
extra = (AOTModuleInstanceExtra *)module_inst->e;
#if WASM_ENABLE_GC != 0
@ -2353,6 +2359,10 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst)
wasm_exec_env_destroy((WASMExecEnv *)module_inst->exec_env_singleton);
}
#if WASM_ENABLE_THREAD_MGR != 0
os_mutex_destroy(&module_inst->e->common.exception_lock);
#endif
#if WASM_ENABLE_PERF_PROFILING != 0
if (module_inst->func_perf_profilings)
wasm_runtime_free(module_inst->func_perf_profilings);

View File

@ -2512,6 +2512,12 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent,
module_inst->module = module;
module_inst->e =
(WASMModuleInstanceExtra *)((uint8 *)module_inst + extra_info_offset);
#if WASM_ENABLE_THREAD_MGR != 0
if (os_mutex_init(&module_inst->e->common.exception_lock) != 0) {
wasm_runtime_free(module_inst);
return NULL;
}
#endif
#if WASM_ENABLE_MULTI_MODULE != 0
module_inst->e->sub_module_inst_list =
@ -3501,6 +3507,9 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
bh_bitmap_delete(module_inst->e->common.elem_dropped);
#endif
#if WASM_ENABLE_THREAD_MGR != 0
os_mutex_destroy(&module_inst->e->common.exception_lock);
#endif
wasm_runtime_free(module_inst);
}

View File

@ -334,6 +334,9 @@ typedef struct WASMModuleInstanceExtraCommon {
/* The gc heap created */
void *gc_heap_handle;
#endif
#if WASM_ENABLE_THREAD_MGR != 0
korp_mutex exception_lock;
#endif
} WASMModuleInstanceExtraCommon;
/* Extra info of WASM module instance for interpreter/jit mode */

View File

@ -29,8 +29,6 @@ static bh_list cluster_list_head;
static bh_list *const cluster_list = &cluster_list_head;
static korp_mutex cluster_list_lock;
static korp_mutex _exception_lock;
typedef void (*list_visitor)(void *, void *);
static uint32 cluster_max_thread_num = CLUSTER_MAX_THREAD_NUM;
@ -51,10 +49,6 @@ thread_manager_init()
return false;
if (os_mutex_init(&cluster_list_lock) != 0)
return false;
if (os_mutex_init(&_exception_lock) != 0) {
os_mutex_destroy(&cluster_list_lock);
return false;
}
return true;
}
@ -69,7 +63,6 @@ thread_manager_destroy()
cluster = next;
}
wasm_cluster_cancel_all_callbacks();
os_mutex_destroy(&_exception_lock);
os_mutex_destroy(&cluster_list_lock);
}
@ -1540,19 +1533,13 @@ wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env)
void
exception_lock(WASMModuleInstance *module_inst)
{
/*
* Note: this lock could be per module instance if desirable.
* We can revisit on AOT version bump.
* It probably doesn't matter though because the exception handling
* logic should not be executed too frequently anyway.
*/
os_mutex_lock(&_exception_lock);
os_mutex_lock(&module_inst->e->common.exception_lock);
}
void
exception_unlock(WASMModuleInstance *module_inst)
{
os_mutex_unlock(&_exception_lock);
os_mutex_unlock(&module_inst->e->common.exception_lock);
}
void