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.
54 lines
1008 B
54 lines
1008 B
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
class Semaphore { |
|
/** |
|
* Creates an instance of Semaphore. |
|
* |
|
* @param {number} available the amount available number of "tasks" |
|
* in the Semaphore |
|
*/ |
|
constructor(available) { |
|
this.available = available; |
|
/** @type {(function(): void)[]} */ |
|
this.waiters = []; |
|
/** @private */ |
|
this._continue = this._continue.bind(this); |
|
} |
|
|
|
/** |
|
* @param {function(): void} callback function block to capture and run |
|
* @returns {void} |
|
*/ |
|
acquire(callback) { |
|
if (this.available > 0) { |
|
this.available--; |
|
callback(); |
|
} else { |
|
this.waiters.push(callback); |
|
} |
|
} |
|
|
|
release() { |
|
this.available++; |
|
if (this.waiters.length > 0) { |
|
process.nextTick(this._continue); |
|
} |
|
} |
|
|
|
_continue() { |
|
if (this.available > 0) { |
|
if (this.waiters.length > 0) { |
|
this.available--; |
|
const callback = this.waiters.pop(); |
|
callback(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
module.exports = Semaphore;
|
|
|