Offload functions to worker threads with shared memory primitives for Node.js.
1import { registerSync } from './reconstruct.ts';
2
3export class BoolAtomic {
4 static readonly byteSize = 1;
5 static readonly byteAlignment = 1;
6 private readonly view: Uint8Array;
7
8 constructor(buffer?: SharedArrayBuffer, byteOffset?: number) {
9 const buf = buffer ?? new SharedArrayBuffer(1);
10 const offset = byteOffset ?? 0;
11 this.view = new Uint8Array(buf, offset, 1);
12 }
13
14 load(): boolean {
15 return Atomics.load(this.view, 0) !== 0;
16 }
17
18 store(value: boolean): void {
19 Atomics.store(this.view, 0, value ? 1 : 0);
20 }
21
22 and(value: boolean): boolean {
23 return Atomics.and(this.view, 0, value ? 1 : 0) !== 0;
24 }
25
26 or(value: boolean): boolean {
27 return Atomics.or(this.view, 0, value ? 1 : 0) !== 0;
28 }
29
30 xor(value: boolean): boolean {
31 return Atomics.xor(this.view, 0, value ? 1 : 0) !== 0;
32 }
33
34 exchange(value: boolean): boolean {
35 return Atomics.exchange(this.view, 0, value ? 1 : 0) !== 0;
36 }
37
38 compareExchange(expected: boolean, replacement: boolean): boolean {
39 return Atomics.compareExchange(this.view, 0, expected ? 1 : 0, replacement ? 1 : 0) !== 0;
40 }
41
42 [Symbol.for('moroutine.shared')](): { tag: string; buffer: SharedArrayBuffer; byteOffset: number } {
43 return { tag: 'BoolAtomic', buffer: this.view.buffer as SharedArrayBuffer, byteOffset: this.view.byteOffset };
44 }
45}
46
47registerSync('BoolAtomic', BoolAtomic);