You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.4 KiB
68 lines
1.4 KiB
"use strict";
|
|
|
|
exports.__esModule = true;
|
|
exports.asap = asap;
|
|
exports.suspend = suspend;
|
|
exports.flush = flush;
|
|
var queue = [];
|
|
/**
|
|
Variable to hold a counting semaphore
|
|
- Incrementing adds a lock and puts the scheduler in a `suspended` state (if it's not
|
|
already suspended)
|
|
- Decrementing releases a lock. Zero locks puts the scheduler in a `released` state. This
|
|
triggers flushing the queued tasks.
|
|
**/
|
|
var semaphore = 0;
|
|
|
|
/**
|
|
Executes a task 'atomically'. Tasks scheduled during this execution will be queued
|
|
and flushed after this task has finished (assuming the scheduler endup in a released
|
|
state).
|
|
**/
|
|
function exec(task) {
|
|
try {
|
|
suspend();
|
|
task();
|
|
} finally {
|
|
release();
|
|
}
|
|
}
|
|
|
|
/**
|
|
Executes or queues a task depending on the state of the scheduler (`suspended` or `released`)
|
|
**/
|
|
function asap(task) {
|
|
queue.push(task);
|
|
|
|
if (!semaphore) {
|
|
suspend();
|
|
flush();
|
|
}
|
|
}
|
|
|
|
/**
|
|
Puts the scheduler in a `suspended` state. Scheduled tasks will be queued until the
|
|
scheduler is released.
|
|
**/
|
|
function suspend() {
|
|
semaphore++;
|
|
}
|
|
|
|
/**
|
|
Puts the scheduler in a `released` state.
|
|
**/
|
|
function release() {
|
|
semaphore--;
|
|
}
|
|
|
|
/**
|
|
Releases the current lock. Executes all queued tasks if the scheduler is in the released state.
|
|
**/
|
|
function flush() {
|
|
release();
|
|
|
|
var task = void 0;
|
|
while (!semaphore && (task = queue.shift()) !== undefined) {
|
|
exec(task);
|
|
}
|
|
} |