Path: blob/main/test/atomic/test_wait32_notify.c
4130 views
#include <emscripten/atomic.h>1#include <emscripten/html5.h>2#include <assert.h>34#ifdef __EMSCRIPTEN_WASM_WORKERS__5#include <emscripten/wasm_worker.h>6#else7#include <pthread.h>8#endif910// Test emscripten_atomic_wait_u32() and emscripten_atomic_notify() functions.1112volatile int32_t addr = 0;1314void run_test() {15emscripten_out("worker_main");16emscripten_atomic_store_u32((void*)&addr, 1);1718emscripten_out("Waiting on address with unexpected value should return 'not-equal'");19ATOMICS_WAIT_RESULT_T ret = emscripten_atomic_wait_u32((int32_t*)&addr, 2, /*timeout=*/-1);20assert(ret == ATOMICS_WAIT_NOT_EQUAL);2122emscripten_out("Waiting on address with unexpected value should return 'not-equal' also if timeout==0");23ret = emscripten_atomic_wait_u32((int32_t*)&addr, 2, /*timeout=*/0);24assert(ret == ATOMICS_WAIT_NOT_EQUAL);2526emscripten_out("Waiting for 0 nanoseconds should return 'timed-out'");27ret = emscripten_atomic_wait_u32((int32_t*)&addr, 1, /*timeout=*/0);28assert(ret == ATOMICS_WAIT_TIMED_OUT);2930emscripten_out("Waiting for >0 nanoseconds should return 'timed-out'");31ret = emscripten_atomic_wait_u32((int32_t*)&addr, 1, /*timeout=*/1000);32assert(ret == ATOMICS_WAIT_TIMED_OUT);3334emscripten_out("Waiting for infinitely long should return 'ok'");35emscripten_atomic_store_u32((void*)&addr, 3);36ret = emscripten_atomic_wait_u32((int32_t*)&addr, 3, /*timeout=*/-1);37assert(ret == ATOMICS_WAIT_OK);3839emscripten_out("Test finished");40}414243// This test run in both wasm workers and pthreads mode44#ifdef __EMSCRIPTEN_WASM_WORKERS__4546void worker_main() {47run_test();4849#ifdef REPORT_RESULT50REPORT_RESULT(addr);51#endif52}5354#else5556pthread_t t;5758void* thread_main(void* arg) {59run_test();60return 0;61}6263#endif646566bool main_loop(double time, void *userData) {67if (addr == 3) {68// Burn one second to make sure worker finishes its test.69emscripten_out("main: seen worker running");70double t0 = emscripten_performance_now();71while(emscripten_performance_now() < t0 + 1000);7273// Wake the waiter74emscripten_out("main: waking worker");75emscripten_atomic_notify((int32_t*)&addr, 1);7677#ifndef __EMSCRIPTEN_WASM_WORKERS__78pthread_join(t, NULL);79#endif8081return false;82}83return true;84}8586int main() {87emscripten_out("main: creating worker");8889#ifdef __EMSCRIPTEN_WASM_WORKERS__90static char stack[1024];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