@@ -30,6 +30,11 @@ typedef struct AtomicWaitNode {
30
30
korp_cond wait_cond ;
31
31
} AtomicWaitNode ;
32
32
33
+ typedef struct AtomicWaitAddressArgs {
34
+ uint32 index ;
35
+ void * * addr ;
36
+ } AtomicWaitAddressArgs ;
37
+
33
38
/* Atomic wait map */
34
39
static HashMap * wait_map ;
35
40
@@ -87,6 +92,53 @@ search_module(WASMModuleCommon *module)
87
92
return NULL ;
88
93
}
89
94
95
+ static void
96
+ wait_map_address_count_callback (void * key , void * value ,
97
+ void * p_total_elem_count )
98
+ {
99
+ * (uint32 * )p_total_elem_count = * (uint32 * )p_total_elem_count + 1 ;
100
+ }
101
+
102
+ static void
103
+ create_list_of_waiter_addresses (void * key , void * value , void * user_data )
104
+ {
105
+ AtomicWaitAddressArgs * data = (AtomicWaitAddressArgs * )user_data ;
106
+ data -> addr [data -> index ++ ] = key ;
107
+ }
108
+
109
+ void
110
+ notify_stale_threads_on_exception (WASMModuleInstanceCommon * module_inst )
111
+ {
112
+ AtomicWaitAddressArgs args = { 0 };
113
+ uint32 i = 0 , total_elem_count = 0 ;
114
+
115
+ os_mutex_lock (& shared_memory_list_lock );
116
+
117
+ /* count number of addresses in wait_map */
118
+ bh_hash_map_traverse (wait_map , wait_map_address_count_callback ,
119
+ (void * )& total_elem_count );
120
+
121
+ /* allocate memory */
122
+ if (!(args .addr = wasm_runtime_malloc (sizeof (void * ) * total_elem_count ))) {
123
+ LOG_ERROR (
124
+ "failed to allocate memory for list of atomic wait addresses" );
125
+ os_mutex_unlock (& shared_memory_list_lock );
126
+ return ;
127
+ }
128
+
129
+ /* set values in list of addresses */
130
+ bh_hash_map_traverse (wait_map , create_list_of_waiter_addresses , & args );
131
+ os_mutex_unlock (& shared_memory_list_lock );
132
+
133
+ /* notify */
134
+ for (i = 0 ; i < args .index ; i ++ ) {
135
+ wasm_runtime_atomic_notify (module_inst , args .addr [i ], UINT32_MAX );
136
+ }
137
+
138
+ /* free memory allocated to args data */
139
+ wasm_runtime_free (args .addr );
140
+ }
141
+
90
142
WASMSharedMemNode *
91
143
wasm_module_get_shared_memory (WASMModuleCommon * module )
92
144
{
@@ -322,6 +374,10 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address,
322
374
bh_assert (module -> module_type == Wasm_Module_Bytecode
323
375
|| module -> module_type == Wasm_Module_AoT );
324
376
377
+ if (wasm_get_exception (module_inst )) {
378
+ return -1 ;
379
+ }
380
+
325
381
/* Currently we have only one memory instance */
326
382
if (!module_inst -> memories [0 ]-> is_shared ) {
327
383
wasm_runtime_set_exception (module , "expected shared memory" );
0 commit comments