@@ -30,6 +30,11 @@ typedef struct AtomicWaitNode {
30
30
korp_cond wait_cond ;
31
31
} AtomicWaitNode ;
32
32
33
+ typedef struct AtomicWaitAddressArgs {
34
+ uint32 len ;
35
+ void * * addr ;
36
+ } AtomicWaitAddressArgs ;
37
+
33
38
/* Atomic wait map */
34
39
static HashMap * wait_map ;
35
40
@@ -87,6 +92,55 @@ search_module(WASMModuleCommon *module)
87
92
return NULL ;
88
93
}
89
94
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
+
90
144
WASMSharedMemNode *
91
145
wasm_module_get_shared_memory (WASMModuleCommon * module )
92
146
{
0 commit comments