38 lines
675 B
JavaScript
38 lines
675 B
JavaScript
|
/*
|
||
|
* Copyright (c) 2018
|
||
|
*
|
||
|
* This file is licensed under the Affero General Public License version 3
|
||
|
* or later.
|
||
|
*
|
||
|
* See the COPYING-README file.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
(function(){
|
||
|
var Semaphore = function(max) {
|
||
|
var counter = 0;
|
||
|
var waiting = [];
|
||
|
|
||
|
this.acquire = function() {
|
||
|
if(counter < max) {
|
||
|
counter++;
|
||
|
return new Promise(function(resolve) { resolve(); });
|
||
|
} else {
|
||
|
return new Promise(function(resolve) { waiting.push(resolve); });
|
||
|
}
|
||
|
};
|
||
|
|
||
|
this.release = function() {
|
||
|
counter--;
|
||
|
if (waiting.length > 0 && counter < max) {
|
||
|
counter++;
|
||
|
var promise = waiting.shift();
|
||
|
promise();
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
|
||
|
OCA.Files.Semaphore = Semaphore;
|
||
|
|
||
|
})();
|