Files
scriptc/tests/corpus/native-worker-shared-views.ts
Chris Tate 095b619330 Add native workers and shared memory
- Add native worker execution with isolated module state, structured messages, and lifecycle controls.
- Support shared buffers and integer atomics with coordinated runtime ownership and cancellation.
- Extend compiler, runtime-pack, differential, and compatibility coverage for native concurrency.
2026-10-07 19:07:02 -05:00

26 lines
1.3 KiB
TypeScript

import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads";
if (isMainThread) {
const buffer = new SharedArrayBuffer(32);
const values = new Int32Array(buffer);
const view = new DataView(buffer, 16, 8);
view.setInt32(0, 123, true);
const worker = new Worker(new URL(import.meta.url), {workerData: {buffer, values, view}});
worker.on("message", (value: unknown) => {
if (value === "ready") {
for (let i = 0; i < 10000; i++) Atomics.add(values, 0, 1);
Atomics.store(values, 1, 1);
Atomics.notify(values, 1);
} else console.log(JSON.stringify(value));
});
worker.on("exit", (code: number) => console.log("exit", code, values[0], view.getInt32(0, true), buffer.byteLength));
} else {
const data = workerData as {buffer: SharedArrayBuffer, values: Int32Array, view: DataView};
const values = data.values;
parentPort!.postMessage("ready");
for (let i = 0; i < 10000; i++) Atomics.add(values, 0, 1);
while (Atomics.load(values, 1) === 0) Atomics.wait(values, 1, 0);
data.view.setInt32(0, data.view.getInt32(0, true) + 1, true);
const alias = new Int32Array(data.buffer, 16, 1);
parentPort!.postMessage({shared: data.buffer instanceof SharedArrayBuffer, alias: alias[0], same: data.values.buffer === data.buffer, offset: data.view.byteOffset});
}