blob: e5371a6bd4fd6bacec43a95a25e7d2b8d8a93211 [file]
#include <emscripten/console.h>
#include <emscripten/wasm_worker.h>
#include <emscripten/threading.h>
#include <stdlib.h>
#include <assert.h>
// Tests emscripten_lock_wait_acquire() between two Wasm Workers.
emscripten_lock_t lock = EMSCRIPTEN_LOCK_T_STATIC_INITIALIZER;
void worker1_main() {
emscripten_out("worker1 main try_acquiring lock");
bool success = emscripten_lock_try_acquire(&lock); // Expect no contention on free lock.
emscripten_out("worker1 try_acquire lock finished");
assert(success);
emscripten_out("worker1 try_acquire lock success, sleeping 1000 msecs");
emscripten_wasm_worker_sleep(1000 * 1000000ull);
emscripten_out("worker1 slept 1000 msecs, releasing lock");
emscripten_lock_release(&lock);
emscripten_out("worker1 released lock");
}
void worker2_main() {
emscripten_out("worker2 main sleeping 500 msecs");
emscripten_wasm_worker_sleep(500 * 1000000ull);
emscripten_out("worker2 slept 500 msecs, try_acquiring lock");
bool success = emscripten_lock_try_acquire(&lock); // At this time, the other thread should have the lock.
emscripten_out("worker2 try_acquire lock finished");
assert(!success);
// Wait enough time to cover over the time that the other thread held the lock.
success = emscripten_lock_wait_acquire(&lock, 2000 * 1000000ull);
emscripten_out("worker2 wait_acquired lock");
assert(success);
#ifdef REPORT_RESULT
REPORT_RESULT(0);
#endif
}
char stack1[4096];
char stack2[4096];
int main() {
emscripten_wasm_worker_t worker1 = emscripten_create_wasm_worker(stack1, sizeof(stack1));
emscripten_wasm_worker_t worker2 = emscripten_create_wasm_worker(stack2, sizeof(stack2));
emscripten_wasm_worker_post_function_v(worker1, worker1_main);
emscripten_wasm_worker_post_function_v(worker2, worker2_main);
}