From 1e316687942da6a66f4cb3d3ca0f315cf2b0318d Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Wed, 6 Nov 2024 13:00:44 -0800 Subject: [PATCH] [WASM_WORKERS] Use typedefs for async callback functions. NFC --- system/include/emscripten/atomic.h | 6 +++--- system/include/emscripten/wasm_worker.h | 17 +++++++++++------ system/lib/wasm_worker/library_wasm_worker.c | 8 ++++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/system/include/emscripten/atomic.h b/system/include/emscripten/atomic.h index 7f9bc49d5d1ad..58075fdef45e2 100644 --- a/system/include/emscripten/atomic.h +++ b/system/include/emscripten/atomic.h @@ -229,7 +229,7 @@ _EM_INLINE int64_t emscripten_atomic_notify(void *addr __attribute__((nonnull)), // Represents a pending 'Atomics.waitAsync' wait operation. #define ATOMICS_WAIT_TOKEN_T int32_t - +typedef void (*emscripten_async_wait_callback_t)(int32_t* address, uint32_t value, ATOMICS_WAIT_RESULT_T waitResult, void* userData); #define EMSCRIPTEN_IS_VALID_WAIT_TOKEN(token) ((token) <= 0) // Issues the JavaScript 'Atomics.waitAsync' instruction: @@ -252,9 +252,9 @@ _EM_INLINE int64_t emscripten_atomic_notify(void *addr __attribute__((nonnull)), // emscripten_atomic_cancel_wait_async() to unregister an asynchronous wait. // You can use the macro EMSCRIPTEN_IS_VALID_WAIT_TOKEN(retval) to check if // this function returned a valid wait token. -ATOMICS_WAIT_TOKEN_T emscripten_atomic_wait_async(void *addr __attribute__((nonnull)), +ATOMICS_WAIT_TOKEN_T emscripten_atomic_wait_async(volatile void *addr __attribute__((nonnull)), uint32_t value, - void (*asyncWaitFinished)(int32_t *addr, uint32_t value, ATOMICS_WAIT_RESULT_T waitResult, void *userData) __attribute__((nonnull)), + emscripten_async_wait_callback_t asyncWaitFinished __attribute__((nonnull)), void *userData, double maxWaitMilliseconds); diff --git a/system/include/emscripten/wasm_worker.h b/system/include/emscripten/wasm_worker.h index 21bf1a82dfd5b..4345522c5d73f 100644 --- a/system/include/emscripten/wasm_worker.h +++ b/system/include/emscripten/wasm_worker.h @@ -12,6 +12,11 @@ extern "C" { #define emscripten_wasm_worker_t int #define EMSCRIPTEN_WASM_WORKER_ID_PARENT 0 +// Similar to emscripten_async_wait_callback_t but with a volatile first +// argument. +typedef void (*emscripten_async_wait_volatile_callback_t)(volatile void* address, uint32_t value, ATOMICS_WAIT_RESULT_T waitResult, void* userData); + + // Creates a new Worker() that is attached to executing this // WebAssembly.Instance and WebAssembly.Memory. // @@ -184,7 +189,7 @@ void emscripten_lock_busyspin_waitinf_acquire(emscripten_lock_t *lock __attribut // use this API in Worker, you cannot utilise an infinite loop programming // model. void emscripten_lock_async_acquire(emscripten_lock_t *lock __attribute__((nonnull)), - void (*asyncWaitFinished)(volatile void *address, uint32_t value, ATOMICS_WAIT_RESULT_T waitResult, void *userData) __attribute__((nonnull)), + emscripten_async_wait_volatile_callback_t asyncWaitFinished __attribute__((nonnull)), void *userData, double maxWaitMilliseconds); @@ -218,7 +223,7 @@ int emscripten_semaphore_try_acquire(emscripten_semaphore_t *sem __attribute__(( // acquired. If you use this API in Worker, you cannot run an infinite loop. void emscripten_semaphore_async_acquire(emscripten_semaphore_t *sem __attribute__((nonnull)), int num, - void (*asyncWaitFinished)(volatile void *address, uint32_t idx, ATOMICS_WAIT_RESULT_T result, void *userData) __attribute__((nonnull)), + emscripten_async_wait_volatile_callback_t asyncWaitFinished __attribute__((nonnull)), void *userData, double maxWaitMilliseconds); @@ -269,10 +274,10 @@ bool emscripten_condvar_wait(emscripten_condvar_t *condvar __attribute__((nonnul // Asynchronously wait for the given condition variable to signal. ATOMICS_WAIT_TOKEN_T emscripten_condvar_wait_async(emscripten_condvar_t *condvar __attribute__((nonnull)), - emscripten_lock_t *lock __attribute__((nonnull)), - void (*asyncWaitFinished)(int32_t *address, uint32_t value, ATOMICS_WAIT_RESULT_T waitResult, void *userData) __attribute__((nonnull)), - void *userData, - double maxWaitMilliseconds); + emscripten_lock_t *lock __attribute__((nonnull)), + emscripten_async_wait_callback_t asyncWaitFinished __attribute__((nonnull)), + void *userData, + double maxWaitMilliseconds); // Signals the given number of waiters on the specified condition variable. // Pass numWaitersToSignal == EMSCRIPTEN_NOTIFY_ALL_WAITERS to wake all waiters diff --git a/system/lib/wasm_worker/library_wasm_worker.c b/system/lib/wasm_worker/library_wasm_worker.c index 360bceb051f6b..aa93f3bbc37d8 100644 --- a/system/lib/wasm_worker/library_wasm_worker.c +++ b/system/lib/wasm_worker/library_wasm_worker.c @@ -231,10 +231,10 @@ bool emscripten_condvar_wait(emscripten_condvar_t *condvar, emscripten_lock_t *l } ATOMICS_WAIT_TOKEN_T emscripten_condvar_wait_async(emscripten_condvar_t *condvar, - emscripten_lock_t *lock, - void (*asyncWaitFinished)(int32_t *address, uint32_t value, ATOMICS_WAIT_RESULT_T waitResult, void *userData), - void *userData, - double maxWaitMilliseconds) + emscripten_lock_t *lock, + emscripten_async_wait_callback_t asyncWaitFinished, + void *userData, + double maxWaitMilliseconds) { int val = emscripten_atomic_load_u32((void*)condvar); emscripten_lock_release(lock);