@@ -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 */
3439static 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+
90144WASMSharedMemNode *
91145wasm_module_get_shared_memory (WASMModuleCommon * module )
92146{
0 commit comments