Skip to content

Commit 6ed0239

Browse files
author
Hritik Gupta
committed
fix: converted ll impl to array, addressed comments
1 parent 152a27b commit 6ed0239

File tree

1 file changed

+22
-28
lines changed

1 file changed

+22
-28
lines changed

core/iwasm/common/wasm_shared_memory.c

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "bh_log.h"
77
#include "wasm_shared_memory.h"
8+
#define WAIT_MAP_SIZE 32
89

910
static bh_list shared_memory_list_head;
1011
static 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 */
3940
static HashMap *wait_map;
@@ -95,38 +96,31 @@ search_module(WASMModuleCommon *module)
9596
static void
9697
create_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

109103
void
110104
notify_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

132126
WASMSharedMemNode *

0 commit comments

Comments
 (0)