blob: 32e09ddd25ed51f81440e4578f1b4ef738e669af [file]
/*
* Copyright 2026 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
#include <emscripten/promise.h>
#include <emscripten/atomic.h>
#include "threading_internal.h"
ATOMICS_WAIT_TOKEN_T emscripten_atomic_wait_suspending(volatile void * _Nonnull addr,
uint32_t value,
double maxWaitMilliseconds) {
intptr_t res = _emscripten_atomic_wait_promise(addr, value, maxWaitMilliseconds);
// A negative value is a synchronous result code.
if (res < 0) {
return (ATOMICS_WAIT_TOKEN_T)-res;
}
// Otherwise a positive value is a promise ID, and we can then `await` using
// ASYNCIFY/JSPI.
em_promise_t promise = (em_promise_t)res;
void* await_result = emscripten_promise_await_unchecked(promise);
return (ATOMICS_WAIT_TOKEN_T)(intptr_t)await_result;
}