87 lines
2.5 KiB
JavaScript
87 lines
2.5 KiB
JavaScript
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);
|
|
}
|
|
|