5
5
6
6
#include "bh_log.h"
7
7
#include "wasm_shared_memory.h"
8
+ #define WAIT_MAP_SIZE 32
8
9
9
10
static bh_list shared_memory_list_head ;
10
11
static bh_list * const shared_memory_list = & shared_memory_list_head ;
@@ -30,6 +31,11 @@ typedef struct AtomicWaitNode {
30
31
korp_cond wait_cond ;
31
32
} AtomicWaitNode ;
32
33
34
+ typedef struct AtomicWaitAddressArgs {
35
+ uint32 index ;
36
+ void * addr [WAIT_MAP_SIZE ];
37
+ } AtomicWaitAddressArgs ;
38
+
33
39
/* Atomic wait map */
34
40
static HashMap * wait_map ;
35
41
@@ -87,6 +93,37 @@ search_module(WASMModuleCommon *module)
87
93
return NULL ;
88
94
}
89
95
96
+ static void
97
+ create_list_of_waiter_addresses (void * key , void * value , void * user_data )
98
+ {
99
+ AtomicWaitAddressArgs * data = (AtomicWaitAddressArgs * )user_data ;
100
+ data -> addr [(data -> index ++ ) % WAIT_MAP_SIZE ] = key ;
101
+ }
102
+
103
+ void
104
+ notify_stale_threads_on_exception (WASMModuleInstanceCommon * module_inst )
105
+ {
106
+ AtomicWaitAddressArgs * args = NULL ;
107
+ if (!(args = wasm_runtime_malloc (sizeof (AtomicWaitAddressArgs )))) {
108
+ LOG_ERROR ("failed to create atomic wait address args node" );
109
+ return ;
110
+ }
111
+
112
+ memset (args , 0 , sizeof (* args ));
113
+ os_mutex_lock (& shared_memory_list_lock );
114
+ // create list of addresses
115
+ bh_hash_map_traverse (wait_map , create_list_of_waiter_addresses , args );
116
+ os_mutex_unlock (& shared_memory_list_lock );
117
+
118
+ // notify
119
+ for (uint32 i = 0 ; i < (args -> index % WAIT_MAP_SIZE ); i ++ ) {
120
+ wasm_runtime_atomic_notify (module_inst , args -> addr [i ], UINT32_MAX );
121
+ }
122
+
123
+ // free memory allocated to args data
124
+ wasm_runtime_free (args );
125
+ }
126
+
90
127
WASMSharedMemNode *
91
128
wasm_module_get_shared_memory (WASMModuleCommon * module )
92
129
{
0 commit comments