blob: e5606027b776a31a0f0043a69a4583ba285fe2d8 [file] [log] [blame]
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:
postMessage("Error: bad result from wait: " + result);
postMessage("error");
break;
}
var value = memory[index];
if (value != wakeCondition) {
postMessage("Error: wait returned not-equal but the memory has a bad value: " + value);
postMessage("error");
}
}
var value = memory[index];
if (value != wakeCondition) {
postMessage("Error: done waiting but the memory has a bad value: " + value);
postMessage("error");
}
}
function wake(memory, index)
{
var result = Atomics.wake(memory, index, 1);
if (result != 0 && result != 1) {
postMessage("Error: bad result from wake: " + result);
postMessage("error");
}
}
function checkBufferSharing(shouldShareBuffer)
{
var set = new Set();
for (var i = 1; i < arguments.length; ++i)
set.add(arguments[i].buffer);
if (shouldShareBuffer) {
if (set.size != 1) {
postMessage("Error: buffers should be shared but are not shared (set.size == " + set.size + ")");
postMessage("error");
}
} else {
if (set.size != arguments.length - 1) {
postMessage("Error: buffers should not be shared but are shared");
postMessage("error");
}
}
}
var cascadeLockUnlocked = 0;
var cascadeLockLocked = 1;
var cascadeLockLockedAndParked = 2;
function cascadeLockSlow(memory, index)
{
var desiredState = cascadeLockLocked;
for (;;) {
if (Atomics.compareExchange(memory, index, cascadeLockUnlocked, desiredState) == cascadeLockUnlocked)
return;
desiredState = cascadeLockLockedAndParked;
Atomics.compareExchange(memory, index, cascadeLockLocked, cascadeLockLockedAndParked);
Atomics.wait(memory, index, cascadeLockLockedAndParked);
}
}
function cascadeLock(memory, index)
{
if (Atomics.compareExchange(memory, index, cascadeLockUnlocked, cascadeLockLocked) == cascadeLockUnlocked)
return;
cascadeLockSlow(memory, index);
}
function cascadeUnlock(memory, index)
{
if (Atomics.exchange(memory, index, cascadeLockUnlocked) == cascadeLockLocked)
return;
Atomics.wake(memory, index, 1);
}