mirror of
https://github.com/eigent-ai/eigent.git
synced 2026-04-29 04:00:09 +00:00
57 lines
1.2 KiB
JavaScript
57 lines
1.2 KiB
JavaScript
// src/utils/locks.tsx
|
|
import { Semaphore } from "async-mutex";
|
|
var ReadWriteLock = class {
|
|
constructor() {
|
|
this.semaphore = new Semaphore(1);
|
|
this.readers = 0;
|
|
this.readersMutex = new Semaphore(1);
|
|
}
|
|
async withReadLock(callback) {
|
|
await this._acquireReadLock();
|
|
try {
|
|
return await callback();
|
|
} finally {
|
|
await this._releaseReadLock();
|
|
}
|
|
}
|
|
async withWriteLock(callback) {
|
|
await this._acquireWriteLock();
|
|
try {
|
|
return await callback();
|
|
} finally {
|
|
await this._releaseWriteLock();
|
|
}
|
|
}
|
|
async _acquireReadLock() {
|
|
await this.readersMutex.acquire();
|
|
try {
|
|
this.readers += 1;
|
|
if (this.readers === 1) {
|
|
await this.semaphore.acquire();
|
|
}
|
|
} finally {
|
|
this.readersMutex.release();
|
|
}
|
|
}
|
|
async _releaseReadLock() {
|
|
await this.readersMutex.acquire();
|
|
try {
|
|
this.readers -= 1;
|
|
if (this.readers === 0) {
|
|
this.semaphore.release();
|
|
}
|
|
} finally {
|
|
this.readersMutex.release();
|
|
}
|
|
}
|
|
async _acquireWriteLock() {
|
|
await this.semaphore.acquire();
|
|
}
|
|
async _releaseWriteLock() {
|
|
this.semaphore.release();
|
|
}
|
|
};
|
|
export {
|
|
ReadWriteLock
|
|
};
|
|
//# sourceMappingURL=locks.js.map
|