Move exception lock to ModuleInstance data. (#4772)

* 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.

Update AOT_CURRENT_VERSION constant.
This commit is contained in:
Vyacheslav Chigrin 2026-03-16 11:22:07 +03:00 committed by GitHub
parent 46472ee6c8
commit 26aa924acd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 43 additions and 16 deletions

View File

@ -84,7 +84,7 @@
#endif
#define AOT_MAGIC_NUMBER 0x746f6100
#define AOT_CURRENT_VERSION 5
#define AOT_CURRENT_VERSION 6
#ifndef WASM_ENABLE_JIT
#define WASM_ENABLE_JIT 0

View File

@ -1963,6 +1963,12 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent,
module_inst->e =
(WASMModuleInstanceExtra *)((uint8 *)module_inst + extra_info_offset);
extra = (AOTModuleInstanceExtra *)module_inst->e;
#if WASM_ENABLE_THREAD_MGR != 0
if (os_mutex_init(&extra->common.exception_lock) != 0) {
wasm_runtime_free(module_inst);
return NULL;
}
#endif
#if WASM_ENABLE_GC != 0
/* Initialize gc heap first since it may be used when initializing
@ -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(&extra->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

@ -8136,3 +8136,18 @@ wasm_runtime_check_and_update_last_used_shared_heap(
return false;
}
#endif
WASMModuleInstanceExtraCommon *
GetModuleInstanceExtraCommon(WASMModuleInstance *module_inst)
{
#if WASM_ENABLE_AOT != 0
if (module_inst->module_type == Wasm_Module_AoT) {
return &((AOTModuleInstanceExtra *)module_inst->e)->common;
}
else {
return &module_inst->e->common;
}
#else
return &module_inst->e->common;
#endif
}

View File

@ -1427,6 +1427,9 @@ wasm_runtime_check_and_update_last_used_shared_heap(
uint8 **shared_heap_base_addr_adj_p, bool is_memory64);
#endif
struct WASMModuleInstanceExtraCommon *
GetModuleInstanceExtraCommon(struct WASMModuleInstance *module_inst);
#ifdef __cplusplus
}
#endif

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(&GetModuleInstanceExtraCommon(module_inst)->exception_lock);
}
void
exception_unlock(WASMModuleInstance *module_inst)
{
os_mutex_unlock(&_exception_lock);
os_mutex_unlock(&GetModuleInstanceExtraCommon(module_inst)->exception_lock);
}
void