55
66#include "bh_log.h"
77#include "wasm_shared_memory.h"
8+ #define WAIT_MAP_SIZE 32
89
910static bh_list shared_memory_list_head ;
1011static bh_list * const shared_memory_list = & shared_memory_list_head ;
@@ -30,10 +31,10 @@ typedef struct AtomicWaitNode {
3031 korp_cond wait_cond ;
3132} AtomicWaitNode ;
3233
33- typedef struct AtomicWaitAddressNode {
34- bh_list_link l ;
35- void * addr ;
36- } AtomicWaitAddressNode ;
34+ typedef struct AtomicWaitAddressArgs {
35+ uint32 index ;
36+ void * addr [ WAIT_MAP_SIZE ] ;
37+ } AtomicWaitAddressArgs ;
3738
3839/* Atomic wait map */
3940static HashMap * wait_map ;
@@ -95,38 +96,31 @@ search_module(WASMModuleCommon *module)
9596static void
9697create_list_of_waiter_addresses (void * key , void * value , void * user_data )
9798{
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 );
99+ AtomicWaitAddressArgs * data = (AtomicWaitAddressArgs * )user_data ;
100+ data -> addr [(data -> index ++ ) % WAIT_MAP_SIZE ] = key ;
107101}
108102
109103void
110104notify_stale_threads_on_exception (WASMModuleInstanceCommon * module_inst )
111105{
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 ;
115- AtomicWaitAddressNode * node ;
116-
117- bh_list_status ret = bh_list_init (atomic_wait_address_list );
118- bh_assert (ret == BH_LIST_SUCCESS );
106+ AtomicWaitAddressArgs * args = NULL ;
107+ if (!(args = wasm_runtime_malloc (sizeof (AtomicWaitAddressArgs )))) {
108+ return ;
109+ }
119110
120- 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 );
111+ memset (args , 0 , sizeof (* args ));
112+ os_mutex_lock (& shared_memory_list_lock );
113+ // create list of addresses
114+ bh_hash_map_traverse (wait_map , create_list_of_waiter_addresses , args );
115+ os_mutex_unlock (& shared_memory_list_lock );
123116
124- node = bh_list_first_elem (atomic_wait_address_list );
125- while (node ) {
126- wasm_runtime_atomic_notify (module_inst , node -> addr , UINT32_MAX );
127- node = bh_list_elem_next (node );
117+ // notify
118+ for (uint32 i = 0 ; i < (args -> index % WAIT_MAP_SIZE ); i ++ ) {
119+ wasm_runtime_atomic_notify (module_inst , args -> addr [i ], UINT32_MAX );
128120 }
129- os_mutex_unlock (& atomic_wait_address_list_lock );
121+
122+ // free memory allocated to args data
123+ wasm_runtime_free (args );
130124}
131125
132126WASMSharedMemNode *
0 commit comments