@@ -10,10 +10,6 @@ static bh_list shared_memory_list_head;
1010static bh_list * const shared_memory_list = & shared_memory_list_head ;
1111static korp_mutex shared_memory_list_lock ;
1212
13- static bh_list atomic_wait_address_list_head ;
14- static bh_list * const atomic_wait_address_list = & atomic_wait_address_list_head ;
15- static korp_mutex atomic_wait_address_list_lock ;
16-
1713/* clang-format off */
1814enum {
1915 S_WAITING ,
@@ -56,8 +52,6 @@ wasm_shared_memory_init()
5652{
5753 if (os_mutex_init (& shared_memory_list_lock ) != 0 )
5854 return false;
59- if (os_mutex_init (& atomic_wait_address_list_lock ) != 0 )
60- return false;
6155 /* wait map not exists, create new map */
6256 if (!(wait_map = bh_hash_map_create (32 , true, (HashFunc )wait_address_hash ,
6357 (KeyEqualFunc )wait_address_equal , NULL ,
7367wasm_shared_memory_destroy ()
7468{
7569 os_mutex_destroy (& shared_memory_list_lock );
76- os_mutex_destroy (& atomic_wait_address_list_lock );
7770 if (wait_map ) {
7871 bh_hash_map_destroy (wait_map );
7972 }
@@ -99,12 +92,35 @@ search_module(WASMModuleCommon *module)
9992 return NULL ;
10093}
10194
95+ static void
96+ create_list_of_waiter_addresses (void * key , void * value , void * user_data )
97+ {
98+ /* add waiter address to atomic wait list */
99+ AtomicWaitAddressNode * wait_address_node ;
100+
101+ if (!(wait_address_node =
102+ wasm_runtime_malloc (sizeof (AtomicWaitAddressNode )))) {
103+ return ;
104+ }
105+ wait_address_node -> addr = key ;
106+ bh_assert (bh_list_insert (user_data , wait_address_node ) == BH_LIST_SUCCESS );
107+ }
108+
102109void
103110notify_stale_threads_on_exception (WASMModuleInstanceCommon * module_inst )
104111{
112+ bh_list atomic_wait_address_list_head ;
113+ bh_list * const atomic_wait_address_list = & atomic_wait_address_list_head ;
114+ static korp_mutex atomic_wait_address_list_lock ;
105115 AtomicWaitAddressNode * node ;
106116
117+ bh_list_status ret = bh_list_init (atomic_wait_address_list );
118+ bh_assert (ret == BH_LIST_SUCCESS );
119+
107120 os_mutex_lock (& atomic_wait_address_list_lock );
121+ bh_hash_map_traverse (wait_map , create_list_of_waiter_addresses ,
122+ atomic_wait_address_list );
123+
108124 node = bh_list_first_elem (atomic_wait_address_list );
109125 while (node ) {
110126 wasm_runtime_atomic_notify (module_inst , node -> addr , UINT32_MAX );
@@ -330,11 +346,6 @@ release_wait_info(HashMap *wait_map_, AtomicWaitInfo *wait_info, void *address)
330346
331347 if (wait_info -> wait_list -> len == 0 ) {
332348 bh_hash_map_remove (wait_map_ , address , NULL , NULL );
333-
334- os_mutex_lock (& atomic_wait_address_list_lock );
335- bh_list_remove (atomic_wait_address_list , address );
336- os_mutex_unlock (& atomic_wait_address_list_lock );
337-
338349 destroy_wait_info (wait_info );
339350 }
340351
@@ -376,22 +387,6 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address,
376387
377388 os_mutex_lock (& wait_info -> wait_list_lock );
378389
379- /* add waiter address to atomic wait list */
380- AtomicWaitAddressNode * wait_address_node ;
381-
382- os_mutex_lock (& atomic_wait_address_list_lock );
383- if (!(wait_address_node =
384- wasm_runtime_malloc (sizeof (AtomicWaitAddressNode )))) {
385- wasm_runtime_set_exception (module ,
386- "failed to create wait address node" );
387- os_mutex_unlock (& atomic_wait_address_list_lock );
388- return -1 ;
389- }
390- wait_address_node -> addr = address ;
391- bh_assert (bh_list_insert (atomic_wait_address_list , wait_address_node )
392- == BH_LIST_SUCCESS );
393- os_mutex_unlock (& atomic_wait_address_list_lock );
394-
395390 if ((!wait64 && * (uint32 * )address != (uint32 )expect )
396391 || (wait64 && * (uint64 * )address != expect )) {
397392 os_mutex_unlock (& wait_info -> wait_list_lock );
0 commit comments