mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
39 lines
899 B
TypeScript
39 lines
899 B
TypeScript
/**
|
|
* Copyright (c) 2020 Gitpod GmbH. All rights reserved.
|
|
* Licensed under the GNU Affero General Public License (AGPL).
|
|
* See License.AGPL.txt in the project root for license information.
|
|
*/
|
|
|
|
export class Semaphore {
|
|
protected queue: (() => void)[] = [];
|
|
protected used: number;
|
|
|
|
constructor(protected readonly capacity: number) {
|
|
if (capacity < 1) {
|
|
throw new Error("Capacity cannot be less than 1");
|
|
}
|
|
}
|
|
|
|
public release() {
|
|
if (this.used == 0) return;
|
|
|
|
const queued = this.queue.shift();
|
|
if (queued) {
|
|
queued();
|
|
}
|
|
|
|
this.used--;
|
|
}
|
|
|
|
public async acquire(): Promise<void> {
|
|
this.used++;
|
|
if (this.used <= this.capacity) {
|
|
return Promise.resolve();
|
|
}
|
|
|
|
return new Promise<void>((rs, rj) => {
|
|
this.queue.push(rs);
|
|
});
|
|
}
|
|
}
|