@@ -30,6 +30,11 @@ typedef struct AtomicWaitNode {
3030 korp_cond wait_cond ;
3131} AtomicWaitNode ;
3232
33+ typedef struct AtomicWaitAddressArgs {
34+ uint32 index ;
35+ void * * addr ;
36+ } AtomicWaitAddressArgs ;
37+
3338/* Atomic wait map */
3439static HashMap * wait_map ;
3540
@@ -87,6 +92,53 @@ search_module(WASMModuleCommon *module)
8792 return NULL ;
8893}
8994
95+ static void
96+ wait_map_address_count_callback (void * key , void * value ,
97+ void * p_total_elem_count )
98+ {
99+ * (uint32 * )p_total_elem_count = * (uint32 * )p_total_elem_count + 1 ;
100+ }
101+
102+ static void
103+ create_list_of_waiter_addresses (void * key , void * value , void * user_data )
104+ {
105+ AtomicWaitAddressArgs * data = (AtomicWaitAddressArgs * )user_data ;
106+ data -> addr [data -> index ++ ] = key ;
107+ }
108+
109+ void
110+ notify_stale_threads_on_exception (WASMModuleInstanceCommon * module_inst )
111+ {
112+ AtomicWaitAddressArgs args = { 0 };
113+ uint32 i = 0 , total_elem_count = 0 ;
114+
115+ os_mutex_lock (& shared_memory_list_lock );
116+
117+ /* count number of addresses in wait_map */
118+ bh_hash_map_traverse (wait_map , wait_map_address_count_callback ,
119+ (void * )& total_elem_count );
120+
121+ /* allocate memory */
122+ if (!(args .addr = wasm_runtime_malloc (sizeof (void * ) * total_elem_count ))) {
123+ LOG_ERROR (
124+ "failed to allocate memory for list of atomic wait addresses" );
125+ os_mutex_unlock (& shared_memory_list_lock );
126+ return ;
127+ }
128+
129+ /* set values in 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 (i = 0 ; i < args .index ; 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 .addr );
140+ }
141+
90142WASMSharedMemNode *
91143wasm_module_get_shared_memory (WASMModuleCommon * module )
92144{
@@ -322,6 +374,10 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address,
322374 bh_assert (module -> module_type == Wasm_Module_Bytecode
323375 || module -> module_type == Wasm_Module_AoT );
324376
377+ if (wasm_get_exception (module_inst )) {
378+ return -1 ;
379+ }
380+
325381 /* Currently we have only one memory instance */
326382 if (!module_inst -> memories [0 ]-> is_shared ) {
327383 wasm_runtime_set_exception (module , "expected shared memory" );
0 commit comments