//@ skip var sab = new SharedArrayBuffer(100 * 4); var memory = new Int32Array(sab); var numWorkers = 0; function startWorker(code) { print("Starting worker!"); numWorkers++; $.agent.start(code); } resources = ` function wait(memory, index, waitCondition, wakeCondition) { while (memory[index] == waitCondition) { var result = Atomics.wait(memory, index, waitCondition); switch (result) { case "not-equal": case "ok": break; default: $.agent.report("Error: bad result from wait: " + result); $.agent.report("error"); break; } var value = memory[index]; if (value != wakeCondition) { $.agent.report("Error: wait returned not-equal but the memory has a bad value: " + value); $.agent.report("error"); } } var value = memory[index]; if (value != wakeCondition) { $.agent.report("Error: done waiting but the memory has a bad value: " + value); $.agent.report("error"); } } function wake(memory, index) { var result = Atomics.wake(memory, index, 1); if (result != 0 && result != 1) { $.agent.report("Error: bad result from wake: " + result); $.agent.report("error"); } } `; startWorker( resources + ` $.agent.receiveBroadcast(sab => { var memory = new Int32Array(sab); var didStartIdx = 0; var shouldGoIdx = 1; var didEndIdx = 2; $.agent.report("1: Started!"); $.agent.report("1: Memory: " + memory); wait(memory, didStartIdx, 0, 1); $.agent.report("1: It started!"); memory[shouldGoIdx] = 1; wake(memory, shouldGoIdx); wait(memory, didEndIdx, 0, 1); $.agent.report("1: All done!"); $.agent.report("1: Memory: " + memory); $.agent.report("done"); }); `); startWorker( resources + ` $.agent.receiveBroadcast(sab => { var memory = new Int32Array(sab); var didStartIdx = 0; var shouldGoIdx = 1; var didEndIdx = 2; $.agent.report("2: Started!"); $.agent.report("2: Memory: " + memory); Atomics.store(memory, didStartIdx, 1); wake(memory, didStartIdx); wait(memory, shouldGoIdx, 0, 1); Atomics.store(memory, didEndIdx, 1); wake(memory, didEndIdx, 1); $.agent.report("2: Memory: " + memory); $.agent.report("done"); }); `); $.agent.broadcast(sab); for (;;) { var report = waitForReport(); if (report == "done") { if (!--numWorkers) { print("All workers done!"); break; } } else if (report == "error") { print("Test failed!"); throw new Error("Test failed."); } else print("report: " + report); } for (var i = 0; i < 3; ++i) { if (memory[i] != 1) throw "Error: Bad value at memory[" + i + "]: " + memory[i]; } for (var i = 3; i < memory.length; ++i) { if (memory[i] != 0) throw "Error: Bad value at memory[" + i + "]: " + memory[i]; } print("Test passed!");