Skip to content

Commit 22ba795

Browse files
author
Hritik Gupta
committed
fixed terminating stale threads on trap/proc_exit
1 parent 2eed50b commit 22ba795

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

core/iwasm/common/wasm_runtime_common.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,6 +2190,13 @@ wasm_set_exception(WASMModuleInstance *module_inst, const char *exception)
21902190
}
21912191

21922192
#if WASM_ENABLE_THREAD_MGR != 0
2193+
2194+
#if WASM_ENABLE_SHARED_MEMORY
2195+
if (exception) {
2196+
notify_stale_threads_on_exception(
2197+
(WASMModuleInstanceCommon *)module_inst);
2198+
}
2199+
#endif
21932200
exec_env =
21942201
wasm_clusters_search_exec_env((WASMModuleInstanceCommon *)module_inst);
21952202
if (exec_env) {

core/iwasm/common/wasm_shared_memory.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ typedef struct AtomicWaitNode {
3030
korp_cond wait_cond;
3131
} AtomicWaitNode;
3232

33+
typedef struct AtomicWaitAddressArgs {
34+
uint32 len;
35+
void **addr;
36+
} AtomicWaitAddressArgs;
37+
3338
/* Atomic wait map */
3439
static HashMap *wait_map;
3540

@@ -87,6 +92,53 @@ search_module(WASMModuleCommon *module)
8792
return NULL;
8893
}
8994

95+
static void
96+
create_list_of_waiter_addresses(void *key, void *value, void *user_data)
97+
{
98+
AtomicWaitAddressArgs *data = (AtomicWaitAddressArgs *)user_data;
99+
if (data->len > 0) {
100+
if (!(data->addr = wasm_runtime_realloc(data->addr,
101+
data->len * sizeof(uint32)))) {
102+
LOG_ERROR("failed to realloc atomic wait address list during "
103+
"wait_map traversal");
104+
return;
105+
}
106+
}
107+
else {
108+
if (!(data->addr = wasm_runtime_malloc(sizeof(data->len) + 1))) {
109+
LOG_ERROR("failed to malloc atomic wait address list during "
110+
"wait_map traversal");
111+
return;
112+
}
113+
}
114+
data->len++;
115+
data->addr[data->len - 1] = key;
116+
}
117+
118+
void
119+
notify_stale_threads_on_exception(WASMModuleInstanceCommon *module_inst)
120+
{
121+
AtomicWaitAddressArgs *args = NULL;
122+
if (!(args = wasm_runtime_malloc(sizeof(AtomicWaitAddressArgs)))) {
123+
LOG_ERROR("failed to create atomic wait address args node");
124+
return;
125+
}
126+
127+
memset(args, 0, sizeof(*args));
128+
os_mutex_lock(&shared_memory_list_lock);
129+
// create list of addresses
130+
bh_hash_map_traverse(wait_map, create_list_of_waiter_addresses, args);
131+
os_mutex_unlock(&shared_memory_list_lock);
132+
133+
// notify
134+
for (uint32 i = 0; i < args->len; i++) {
135+
wasm_runtime_atomic_notify(module_inst, args->addr[i], UINT32_MAX);
136+
}
137+
138+
// free memory allocated to args data
139+
wasm_runtime_free(args);
140+
}
141+
90142
WASMSharedMemNode *
91143
wasm_module_get_shared_memory(WASMModuleCommon *module)
92144
{

core/iwasm/common/wasm_shared_memory.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ wasm_shared_memory_init();
3737
void
3838
wasm_shared_memory_destroy();
3939

40+
void
41+
notify_stale_threads_on_exception(WASMModuleInstanceCommon *module);
42+
4043
WASMSharedMemNode *
4144
wasm_module_get_shared_memory(WASMModuleCommon *module);
4245

0 commit comments

Comments
 (0)