repositories
/
e-mobility-charging-stations-simulator.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
perf: lookup connector status once at OCPP responses handling
[e-mobility-charging-stations-simulator.git]
/
src
/
utils
/
AsyncLock.ts
diff --git
a/src/utils/AsyncLock.ts
b/src/utils/AsyncLock.ts
index cf0443b29c30268e0326ec5c2c8134b4bc284315..9c0584565e3ecb80897b2ad32418a1afdb0cc888 100644
(file)
--- a/
src/utils/AsyncLock.ts
+++ b/
src/utils/AsyncLock.ts
@@
-1,18
+1,22
@@
// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+import Queue from 'mnemonist/queue.js';
+
export enum AsyncLockType {
configuration = 'configuration',
performance = 'performance',
}
export enum AsyncLockType {
configuration = 'configuration',
performance = 'performance',
}
+type ResolveType = (value: void | PromiseLike<void>) => void;
+
export class AsyncLock {
private static readonly asyncLocks = new Map<AsyncLockType, AsyncLock>();
private acquired: boolean;
export class AsyncLock {
private static readonly asyncLocks = new Map<AsyncLockType, AsyncLock>();
private acquired: boolean;
- private readonly resolveQueue:
((value: void | PromiseLike<void>) => void)[]
;
+ private readonly resolveQueue:
Queue<ResolveType>
;
private constructor() {
this.acquired = false;
private constructor() {
this.acquired = false;
- this.resolveQueue =
[]
;
+ this.resolveQueue =
new Queue<ResolveType>()
;
}
public static async acquire(type: AsyncLockType): Promise<void> {
}
public static async acquire(type: AsyncLockType): Promise<void> {
@@
-21,19
+25,19
@@
export class AsyncLock {
asyncLock.acquired = true;
return;
}
asyncLock.acquired = true;
return;
}
- return new Promise((resolve) => {
- asyncLock.resolveQueue.
push
(resolve);
+ return new Promise
<void>
((resolve) => {
+ asyncLock.resolveQueue.
enqueue
(resolve);
});
}
public static async release(type: AsyncLockType): Promise<void> {
const asyncLock = AsyncLock.getAsyncLock(type);
});
}
public static async release(type: AsyncLockType): Promise<void> {
const asyncLock = AsyncLock.getAsyncLock(type);
- if (asyncLock.resolveQueue.
length
=== 0 && asyncLock.acquired) {
+ if (asyncLock.resolveQueue.
size
=== 0 && asyncLock.acquired) {
asyncLock.acquired = false;
return;
}
asyncLock.acquired = false;
return;
}
- const queuedResolve = asyncLock.resolveQueue.
shift()
;
- return new Promise((resolve) => {
+ const queuedResolve = asyncLock.resolveQueue.
dequeue()!
;
+ return new Promise
<void>
((resolve) => {
queuedResolve();
resolve();
});
queuedResolve();
resolve();
});
@@
-43,6
+47,6
@@
export class AsyncLock {
if (!AsyncLock.asyncLocks.has(type)) {
AsyncLock.asyncLocks.set(type, new AsyncLock());
}
if (!AsyncLock.asyncLocks.has(type)) {
AsyncLock.asyncLocks.set(type, new AsyncLock());
}
- return AsyncLock.asyncLocks.get(type);
+ return AsyncLock.asyncLocks.get(type)
!
;
}
}
}
}