Skip to content

Commit 36314dd

Browse files
authored
fix: queue not processing as expected with multiple requests made (#105)
1 parent 0166756 commit 36314dd

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

src/locks.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,10 @@ void LockManager::ProcessQueue() {
200200
if (IsGrantable(request)) {
201201
Lock* lock = new Lock(request->name(), request->mode());
202202
held_.emplace_back(lock);
203-
requests_.erase(
204-
std::remove(requests_.begin(), requests_.end(), request),
205-
requests_.end());
203+
auto existingRequest = std::find(requests_.begin(), requests_.end(), request);
204+
if (existingRequest != requests_.end()) {
205+
requests_.erase(existingRequest);
206+
}
206207
request->Notify(LockRequest::Status::GRANTED, lock);
207208
}
208209
}

test/locks.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,24 @@ test('waits for lock to free', async ({ resolves, ok }) => {
108108
await resolves(Promise.all([p1, p2]));
109109
});
110110

111+
test('waits for multiple locks to free', async ({ resolves, ok }) => {
112+
let firstCheck : boolean = false;
113+
let secondCheck : boolean = false;
114+
const p0 = request('hello', async () => {
115+
await sleep(10);
116+
firstCheck = true;
117+
});
118+
const p1 = request('hello', async () => {
119+
await sleep(10);
120+
secondCheck = true;
121+
});
122+
const p2 = request('hello', async () => {
123+
ok(firstCheck);
124+
ok(secondCheck);
125+
});
126+
await resolves(Promise.all([p0, p1, p2]));
127+
});
128+
111129
test('cancels with AbortError', async ({ resolves, rejects, equal }) => {
112130
const unusedSignal = new EventEmitter();
113131
const p1 = request('hello', { signal: unusedSignal }, async () => {

0 commit comments

Comments
 (0)