Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/test/atomic/test_wait32_notify.c
4130 views
1
#include <emscripten/atomic.h>
2
#include <emscripten/html5.h>
3
#include <assert.h>
4
5
#ifdef __EMSCRIPTEN_WASM_WORKERS__
6
#include <emscripten/wasm_worker.h>
7
#else
8
#include <pthread.h>
9
#endif
10
11
// Test emscripten_atomic_wait_u32() and emscripten_atomic_notify() functions.
12
13
volatile int32_t addr = 0;
14
15
void run_test() {
16
emscripten_out("worker_main");
17
emscripten_atomic_store_u32((void*)&addr, 1);
18
19
emscripten_out("Waiting on address with unexpected value should return 'not-equal'");
20
ATOMICS_WAIT_RESULT_T ret = emscripten_atomic_wait_u32((int32_t*)&addr, 2, /*timeout=*/-1);
21
assert(ret == ATOMICS_WAIT_NOT_EQUAL);
22
23
emscripten_out("Waiting on address with unexpected value should return 'not-equal' also if timeout==0");
24
ret = emscripten_atomic_wait_u32((int32_t*)&addr, 2, /*timeout=*/0);
25
assert(ret == ATOMICS_WAIT_NOT_EQUAL);
26
27
emscripten_out("Waiting for 0 nanoseconds should return 'timed-out'");
28
ret = emscripten_atomic_wait_u32((int32_t*)&addr, 1, /*timeout=*/0);
29
assert(ret == ATOMICS_WAIT_TIMED_OUT);
30
31
emscripten_out("Waiting for >0 nanoseconds should return 'timed-out'");
32
ret = emscripten_atomic_wait_u32((int32_t*)&addr, 1, /*timeout=*/1000);
33
assert(ret == ATOMICS_WAIT_TIMED_OUT);
34
35
emscripten_out("Waiting for infinitely long should return 'ok'");
36
emscripten_atomic_store_u32((void*)&addr, 3);
37
ret = emscripten_atomic_wait_u32((int32_t*)&addr, 3, /*timeout=*/-1);
38
assert(ret == ATOMICS_WAIT_OK);
39
40
emscripten_out("Test finished");
41
}
42
43
44
// This test run in both wasm workers and pthreads mode
45
#ifdef __EMSCRIPTEN_WASM_WORKERS__
46
47
void worker_main() {
48
run_test();
49
50
#ifdef REPORT_RESULT
51
REPORT_RESULT(addr);
52
#endif
53
}
54
55
#else
56
57
pthread_t t;
58
59
void* thread_main(void* arg) {
60
run_test();
61
return 0;
62
}
63
64
#endif
65
66
67
bool main_loop(double time, void *userData) {
68
if (addr == 3) {
69
// Burn one second to make sure worker finishes its test.
70
emscripten_out("main: seen worker running");
71
double t0 = emscripten_performance_now();
72
while(emscripten_performance_now() < t0 + 1000);
73
74
// Wake the waiter
75
emscripten_out("main: waking worker");
76
emscripten_atomic_notify((int32_t*)&addr, 1);
77
78
#ifndef __EMSCRIPTEN_WASM_WORKERS__
79
pthread_join(t, NULL);
80
#endif
81
82
return false;
83
}
84
return true;
85
}
86
87
int main() {
88
emscripten_out("main: creating worker");
89
90
#ifdef __EMSCRIPTEN_WASM_WORKERS__
91
static char stack[1024];
92
emscripten_wasm_worker_t worker = emscripten_create_wasm_worker(stack, sizeof(stack));
93
emscripten_wasm_worker_post_function_v(worker, worker_main);
94
#else
95
pthread_create(&t, NULL, thread_main, NULL);
96
#endif
97
98
emscripten_out("main: entering timeout loop to wait for wasm worker to run");
99
emscripten_set_timeout_loop(main_loop, 50, 0);
100
}
101
102