Path: blob/main/test/atomic/test_wait64_notify.c
4130 views
#include <emscripten/atomic.h>1#include <emscripten/html5.h> // for emscripten_performance_now()2#include <emscripten.h>3#include <assert.h>45#ifdef __EMSCRIPTEN_WASM_WORKERS__6#include <emscripten/wasm_worker.h>7#else8#include <pthread.h>9#endif1011// Test emscripten_atomic_wait_u64() and emscripten_atomic_notify() functions.1213volatile int64_t addr = 0;1415void run_test() {16emscripten_out("worker_main");17emscripten_atomic_store_u64((void*)&addr, 0x100000000ull);1819emscripten_out("Waiting on address with unexpected value should return 'not-equal'");20ATOMICS_WAIT_RESULT_T ret = emscripten_atomic_wait_u64((int64_t*)&addr, 0x200000000ull, /*timeout=*/-1);21assert(ret == ATOMICS_WAIT_NOT_EQUAL);2223emscripten_out("Waiting on address with unexpected value should return 'not-equal' also if timeout==0");24ret = emscripten_atomic_wait_u64((int64_t*)&addr, 0x200000000ull, /*timeout=*/0);25assert(ret == ATOMICS_WAIT_NOT_EQUAL);2627emscripten_out("Waiting for 0 nanoseconds should return 'timed-out'");28ret = emscripten_atomic_wait_u64((int64_t*)&addr, 0x100000000ull, /*timeout=*/0);29assert(ret == ATOMICS_WAIT_TIMED_OUT);3031emscripten_out("Waiting for >0 nanoseconds should return 'timed-out'");32ret = emscripten_atomic_wait_u64((int64_t*)&addr, 0x100000000ull, /*timeout=*/1000);33assert(ret == ATOMICS_WAIT_TIMED_OUT);3435emscripten_out("Waiting for infinitely long should return 'ok'");36emscripten_atomic_store_u64((void*)&addr, 0x300000000ull);37ret = emscripten_atomic_wait_u64((int64_t*)&addr, 0x300000000ull, /*timeout=*/-1);38assert(ret == ATOMICS_WAIT_OK);3940emscripten_out("Test finished");41}424344// This test run in both wasm workers and pthreads mode45#ifdef __EMSCRIPTEN_WASM_WORKERS__4647char stack[1024];4849void worker_main() {50run_test();51#ifdef REPORT_RESULT52REPORT_RESULT(addr >> 32);53#endif54}5556#else5758pthread_t t;5960void* thread_main(void* arg) {61run_test();62return 0;63}6465#endif6667bool main_loop(double time, void *userData) {68if (addr == 0x300000000ull) {69// Burn one second to make sure worker finishes its test.70emscripten_out("main: seen worker running");71double t0 = emscripten_performance_now();72while(emscripten_performance_now() < t0 + 1000);7374// Wake the waiter75emscripten_out("main: waking worker");76emscripten_atomic_notify((int32_t*)&addr, 1);7778#ifndef __EMSCRIPTEN_WASM_WORKERS__79pthread_join(t, NULL);80#endif8182return false;83}84return true;85}8687int main() {88emscripten_out("main: creating worker");8990#ifdef __EMSCRIPTEN_WASM_WORKERS__91emscripten_wasm_worker_t worker = emscripten_create_wasm_worker(stack, sizeof(stack));92emscripten_wasm_worker_post_function_v(worker, worker_main);93#else94pthread_create(&t, NULL, thread_main, NULL);95#endif9697emscripten_out("main: entering timeout loop to wait for wasm worker to run");98emscripten_set_timeout_loop(main_loop, 50, 0);99}100101102