Skip to content

Commit 0eb38d2

Browse files
committed
fix(memory): update mutex owner when releasing then acquiring again
Close #12
1 parent d5ca7c1 commit 0eb38d2

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

packages/verrou/src/drivers/memory.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,11 @@ export class MemoryStore implements LockStore {
8484
async delete(key: string, owner: string) {
8585
const mutex = this.#locks.get(key)
8686

87-
if (!mutex || !mutex.releaser) throw new E_LOCK_NOT_OWNED()
87+
if (!mutex || !mutex.releaser) return
8888
if (mutex.owner !== owner) throw new E_LOCK_NOT_OWNED()
8989

9090
mutex.releaser()
91+
this.#locks.delete(key)
9192
}
9293

9394
/**

packages/verrou/src/test_suite.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,28 @@ export function registerStoreTestSuite(options: {
149149
assert.deepEqual(result, '42')
150150
})
151151

152+
test('run is exclusive with two factories', async ({ assert }) => {
153+
const provider = new LockFactory(options.createStore())
154+
const lock1 = provider.createLock('foo')
155+
const lock2 = provider.createLock('foo')
156+
157+
let flag = false
158+
lock1.run(async () => {
159+
await sleep(500)
160+
flag = true
161+
})
162+
163+
assert.isFalse(flag)
164+
165+
const [, result] = await lock2.run(async () => {
166+
assert.isTrue(flag)
167+
return '42'
168+
})
169+
170+
assert.isTrue(flag)
171+
assert.deepEqual(result, '42')
172+
})
173+
152174
test('exceptions during run do not leave mutex in locked state', async ({ assert }) => {
153175
const provider = new LockFactory(options.createStore())
154176
const lock = provider.createLock('foo')

0 commit comments

Comments
 (0)