mirror of
https://github.com/OliveTin/OliveTin
synced 2025-12-12 17:15:37 +00:00
25 lines
474 B
JavaScript
25 lines
474 B
JavaScript
export class Mutex {
|
|
constructor() {
|
|
this._locked = false;
|
|
this._waiting = [];
|
|
}
|
|
|
|
lock() {
|
|
const unlock = () => {
|
|
const next = this._waiting.shift();
|
|
if (next) {
|
|
next(unlock);
|
|
} else {
|
|
this._locked = false;
|
|
}
|
|
};
|
|
|
|
if (this._locked) {
|
|
return new Promise(resolve => this._waiting.push(resolve)).then(() => unlock);
|
|
} else {
|
|
this._locked = true;
|
|
return Promise.resolve(unlock);
|
|
}
|
|
}
|
|
}
|