mirror of
https://github.com/OliveTin/OliveTin
synced 2025-12-12 00:55:34 +00:00
25 lines
467 B
JavaScript
25 lines
467 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)
|
|
}
|
|
}
|
|
}
|