1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| var Class = require('./Class');
| var Queue = require('./Queue');
| exports = Class({
| initialize: function Semaphore() {
| var counter =
| arguments.length > 0 && arguments[0] !== undefined
| ? arguments[0]
| : 1;
| this._counter = counter;
| this._tasks = new Queue();
| },
| wait: function(fn) {
| if (this._counter > 0) {
| this._counter--;
| return fn();
| }
| this._tasks.enqueue(fn);
| },
| signal: function() {
| var task = this._tasks.dequeue();
| if (task) {
| return task();
| }
| this._counter++;
| }
| });
|
| module.exports = exports;
|
|