Skip to content

Commit aa481de

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

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-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: 54 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,55 @@ 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 =
109+
wasm_runtime_malloc(sizeof(void *) * (data->len + 1)))) {
110+
LOG_ERROR("failed to malloc atomic wait address list during "
111+
"wait_map traversal");
112+
return;
113+
}
114+
}
115+
data->len++;
116+
data->addr[data->len - 1] = key;
117+
}
118+
119+
void
120+
notify_stale_threads_on_exception(WASMModuleInstanceCommon *module_inst)
121+
{
122+
AtomicWaitAddressArgs *args = NULL;
123+
uint32 i = 0;
124+
if (!(args = wasm_runtime_malloc(sizeof(AtomicWaitAddressArgs)))) {
125+
LOG_ERROR("failed to create atomic wait address args node");
126+
return;
127+
}
128+
129+
memset(args, 0, sizeof(*args));
130+
os_mutex_lock(&shared_memory_list_lock);
131+
/* create list of addresses */
132+
bh_hash_map_traverse(wait_map, create_list_of_waiter_addresses, args);
133+
os_mutex_unlock(&shared_memory_list_lock);
134+
135+
/* notify */
136+
for (i = 0; i < args->len; i++) {
137+
wasm_runtime_atomic_notify(module_inst, args->addr[i], UINT32_MAX);
138+
}
139+
140+
/* free memory allocated to args data */
141+
wasm_runtime_free(args);
142+
}
143+
90144
WASMSharedMemNode *
91145
wasm_module_get_shared_memory(WASMModuleCommon *module)
92146
{

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)