Add Atomics.pause

This commit is contained in:
Ben Noordhuis 2024-11-15 19:16:29 +01:00 committed by Saúl Ibarra Corretgé
parent 42f0945114
commit 407683bd98
2 changed files with 28 additions and 1 deletions

View file

@ -55047,6 +55047,32 @@ static js_mutex_t js_atomics_mutex;
static struct list_head js_atomics_waiter_list = static struct list_head js_atomics_waiter_list =
LIST_HEAD_INIT(js_atomics_waiter_list); LIST_HEAD_INIT(js_atomics_waiter_list);
// no-op: Atomics.pause() is not allowed to block or yield to another
// thread, only to hint the CPU that it should back off for a bit;
// the amount of work we do here is a good enough substitute
static JSValue js_atomics_pause(JSContext *ctx, JSValue this_obj,
int argc, JSValue *argv)
{
double d;
if (argc > 0) {
switch (JS_VALUE_GET_TAG(argv[0])) {
case JS_TAG_FLOAT64: // accepted if and only if fraction == 0.0
d = JS_VALUE_GET_FLOAT64(argv[0]);
if (isfinite(d))
if (0 == modf(d, &d))
break;
// fallthru
default:
return JS_ThrowTypeError(ctx, "not an integral number");
case JS_TAG_UNDEFINED:
case JS_TAG_INT:
break;
}
}
return JS_UNDEFINED;
}
static JSValue js_atomics_wait(JSContext *ctx, static JSValue js_atomics_wait(JSContext *ctx,
JSValue this_obj, JSValue this_obj,
int argc, JSValue *argv) int argc, JSValue *argv)
@ -55176,6 +55202,7 @@ static const JSCFunctionListEntry js_atomics_funcs[] = {
JS_CFUNC_MAGIC_DEF("load", 2, js_atomics_op, ATOMICS_OP_LOAD ), JS_CFUNC_MAGIC_DEF("load", 2, js_atomics_op, ATOMICS_OP_LOAD ),
JS_CFUNC_DEF("store", 3, js_atomics_store ), JS_CFUNC_DEF("store", 3, js_atomics_store ),
JS_CFUNC_DEF("isLockFree", 1, js_atomics_isLockFree ), JS_CFUNC_DEF("isLockFree", 1, js_atomics_isLockFree ),
JS_CFUNC_DEF("pause", 0, js_atomics_pause ),
JS_CFUNC_DEF("wait", 4, js_atomics_wait ), JS_CFUNC_DEF("wait", 4, js_atomics_wait ),
JS_CFUNC_DEF("notify", 3, js_atomics_notify ), JS_CFUNC_DEF("notify", 3, js_atomics_notify ),
JS_PROP_STRING_DEF("[Symbol.toStringTag]", "Atomics", JS_PROP_CONFIGURABLE ), JS_PROP_STRING_DEF("[Symbol.toStringTag]", "Atomics", JS_PROP_CONFIGURABLE ),

View file

@ -64,7 +64,7 @@ async-functions
async-iteration async-iteration
# atomics are broken in recent versions of tcc # atomics are broken in recent versions of tcc
Atomics=!tcc Atomics=!tcc
Atomics.pause=skip Atomics.pause=!tcc
Atomics.waitAsync=skip Atomics.waitAsync=skip
BigInt BigInt
caller caller