Skip to content

lib: narrow Atomics.wait* target to SharedArrayBuffer views #61817

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/lib/es2017.sharedmemory.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,13 +92,17 @@ interface Atomics {
* agent is put to sleep causing execution to suspend until the timeout expires (returning
* `"timed-out"`) or until the agent is awoken (returning `"ok"`); otherwise, returns
* `"not-equal"`.
* @param typedArray An Int32Array that views a SharedArrayBuffer.
* @param index The position in the typedArray on which to wait.
* @param value The expected value to test.
* @param timeout Time to wait in milliseconds. Defaults to +Infinity.
*/
wait(typedArray: Int32Array<ArrayBufferLike>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out";
wait(typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out";

/**
* Wakes up sleeping agents that are waiting on the given index of the array, returning the
* number of agents that were awoken.
* @param typedArray A shared Int32Array<ArrayBufferLike>.
* @param typedArray An Int32Array that views a SharedArrayBuffer.
* @param index The position in the typedArray to wake up on.
* @param count The number of sleeping agents to notify. Defaults to +Infinity.
*/
Expand Down
9 changes: 7 additions & 2 deletions src/lib/es2020.sharedmemory.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/// <reference lib="es2017.sharedmemory" />
/// <reference lib="es2020.bigint" />

interface Atomics {
Expand Down Expand Up @@ -60,13 +61,17 @@ interface Atomics {
* agent is put to sleep causing execution to suspend until the timeout expires (returning
* `"timed-out"`) or until the agent is awoken (returning `"ok"`); otherwise, returns
* `"not-equal"`.
* @param typedArray A BigInt64Array that views a SharedArrayBuffer.
* @param index The position in the typedArray on which to wait.
* @param value The expected value to test.
* @param timeout Time to wait in milliseconds. Defaults to +Infinity.
*/
wait(typedArray: BigInt64Array<ArrayBufferLike>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out";
wait(typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out";

/**
* Wakes up sleeping agents that are waiting on the given index of the array, returning the
* number of agents that were awoken.
* @param typedArray A shared BigInt64Array.
* @param typedArray A BigInt64Array that views a SharedArrayBuffer.
* @param index The position in the typedArray to wake up on.
* @param count The number of sleeping agents to notify. Defaults to +Infinity.
*/
Expand Down
15 changes: 7 additions & 8 deletions src/lib/es2024.sharedmemory.d.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
/// <reference lib="es2017.sharedmemory" />
/// <reference lib="es2020.bigint" />

interface Atomics {
/**
* A non-blocking, asynchronous version of wait which is usable on the main thread.
* Waits asynchronously on a shared memory location and returns a Promise
* @param typedArray A shared Int32Array or BigInt64Array.
* @param typedArray An Int32Array that views a SharedArrayBuffer.
* @param index The position in the typedArray to wait on.
* @param value The expected value to test.
* @param [timeout] The expected value to test.
* @param timeout Time to wait in milliseconds. Defaults to +Infinity.
*/
waitAsync(typedArray: Int32Array, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; };
waitAsync(typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; };

/**
* A non-blocking, asynchronous version of wait which is usable on the main thread.
* Waits asynchronously on a shared memory location and returns a Promise
* @param typedArray A shared Int32Array or BigInt64Array.
* @param typedArray A BigInt64Array that views a SharedArrayBuffer.
* @param index The position in the typedArray to wait on.
* @param value The expected value to test.
* @param [timeout] The expected value to test.
* @param timeout Time to wait in milliseconds. Defaults to +Infinity.
*/
waitAsync(typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; };
waitAsync(typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; };
}

interface SharedArrayBuffer {
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/es2024SharedMemory.types
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,12 @@ const waitValue = Atomics.wait(int32, 0, 0);
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Atomics.wait(int32, 0, 0) : "ok" | "not-equal" | "timed-out"
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Atomics.wait : { (typedArray: Int32Array<ArrayBufferLike>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<ArrayBufferLike>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics.wait : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics : Atomics
> : ^^^^^^^
>wait : { (typedArray: Int32Array<ArrayBufferLike>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<ArrayBufferLike>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>wait : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>int32 : Int32Array<SharedArrayBuffer>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>0 : 0
Expand Down
24 changes: 12 additions & 12 deletions tests/baselines/reference/sharedMemory.types
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ const waitValue = Atomics.wait(int32, 0, 0);
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Atomics.wait(int32, 0, 0) : "ok" | "not-equal" | "timed-out"
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Atomics.wait : { (typedArray: Int32Array<ArrayBufferLike>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<ArrayBufferLike>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics.wait : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics : Atomics
> : ^^^^^^^
>wait : { (typedArray: Int32Array<ArrayBufferLike>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<ArrayBufferLike>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>wait : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out"; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out"; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>int32 : Int32Array<SharedArrayBuffer>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>0 : 0
Expand All @@ -82,12 +82,12 @@ const { async, value } = Atomics.waitAsync(int32, 0, 0);
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Atomics.waitAsync(int32, 0, 0) : { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }
> : ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^
>Atomics.waitAsync : { (typedArray: Int32Array, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics.waitAsync : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics : Atomics
> : ^^^^^^^
>waitAsync : { (typedArray: Int32Array, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>waitAsync : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>int32 : Int32Array<SharedArrayBuffer>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>0 : 0
Expand All @@ -106,12 +106,12 @@ const { async: async64, value: value64 } = Atomics.waitAsync(int64, 0, BigInt(0)
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Atomics.waitAsync(int64, 0, BigInt(0)) : { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }
> : ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^
>Atomics.waitAsync : { (typedArray: Int32Array, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics.waitAsync : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>Atomics : Atomics
> : ^^^^^^^
>waitAsync : { (typedArray: Int32Array, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>waitAsync : { (typedArray: Int32Array<SharedArrayBuffer>, index: number, value: number, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; (typedArray: BigInt64Array<SharedArrayBuffer>, index: number, value: bigint, timeout?: number): { async: false; value: "not-equal" | "timed-out"; } | { async: true; value: Promise<"ok" | "timed-out">; }; }
> : ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
>int64 : BigInt64Array<SharedArrayBuffer>
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>0 : 0
Expand Down