54 lines
1.2 KiB
JavaScript
54 lines
1.2 KiB
JavaScript
class LockQueue {
|
|
constructor(queueSize = 100) {
|
|
this.queueSize = queueSize;
|
|
this.freed = true;
|
|
this.waitingQueue = [];
|
|
}
|
|
|
|
//async
|
|
get(take = true) {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.freed) {
|
|
if (take)
|
|
this.freed = false;
|
|
resolve();
|
|
return;
|
|
}
|
|
|
|
if (this.waitingQueue.length < this.queueSize) {
|
|
this.waitingQueue.push({resolve, reject});
|
|
} else {
|
|
reject(new Error('Lock queue is too long'));
|
|
}
|
|
});
|
|
}
|
|
|
|
ret() {
|
|
if (this.waitingQueue.length) {
|
|
this.waitingQueue.shift().resolve();
|
|
} else {
|
|
this.freed = true;
|
|
}
|
|
}
|
|
|
|
//async
|
|
wait() {
|
|
return this.get(false);
|
|
}
|
|
|
|
retAll() {
|
|
while (this.waitingQueue.length) {
|
|
this.waitingQueue.shift().resolve();
|
|
}
|
|
}
|
|
|
|
errAll(error = 'rejected') {
|
|
while (this.waitingQueue.length) {
|
|
this.waitingQueue.shift().reject(new Error(error));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = LockQueue;
|