X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Futils%2FAsyncLock.ts;h=16ad4f2b1cdcf53b44a90f6b6970858cff789e28;hb=7c2c6fd37881dd238855cae4a0d0a21d0d44111a;hp=229086fef1e8d2b45b9ae8f39ca77b867af0e2d5;hpb=42486f2357b011f9244c6b29f4e05185138ce8d1;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/AsyncLock.ts b/src/utils/AsyncLock.ts index 229086fe..16ad4f2b 100644 --- a/src/utils/AsyncLock.ts +++ b/src/utils/AsyncLock.ts @@ -1,38 +1,42 @@ // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved. +import Queue from 'mnemonist/queue.js'; + export enum AsyncLockType { configuration = 'configuration', performance = 'performance', } +type ResolveType = (value: void | PromiseLike) => void; + export class AsyncLock { private static readonly asyncLocks = new Map(); private acquired: boolean; - private readonly resolveQueue: ((value: void | PromiseLike) => void)[]; + private readonly resolveQueue: Queue; private constructor() { this.acquired = false; - this.resolveQueue = []; + this.resolveQueue = new Queue(); } public static async acquire(type: AsyncLockType): Promise { const asyncLock = AsyncLock.getAsyncLock(type); if (!asyncLock.acquired) { asyncLock.acquired = true; - } else { - return new Promise((resolve) => { - asyncLock.resolveQueue.push(resolve); - }); + return; } + return new Promise((resolve) => { + asyncLock.resolveQueue.enqueue(resolve); + }); } public static async release(type: AsyncLockType): Promise { const asyncLock = AsyncLock.getAsyncLock(type); - if (asyncLock.resolveQueue.length === 0 && asyncLock.acquired) { + if (asyncLock.resolveQueue.size === 0 && asyncLock.acquired) { asyncLock.acquired = false; return; } - const queuedResolve = asyncLock.resolveQueue.shift(); + const queuedResolve = asyncLock.resolveQueue.dequeue(); return new Promise((resolve) => { queuedResolve(); resolve();