Skip to content

Commit 704c22a

Browse files
committed
node-api: release lock before calling user callback
1 parent 6d68e1d commit 704c22a

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/node_api.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,17 +309,21 @@ class ThreadSafeFunction {
309309
}
310310

311311
void EmptyQueueAndMaybeDelete() {
312+
std::queue<void*> drain_queue;
313+
{
314+
node::Mutex::ScopedLock lock(this->mutex);
315+
queue.swap(drain_queue);
316+
}
317+
for (; !drain_queue.empty(); drain_queue.pop()) {
318+
call_js_cb(nullptr, nullptr, context, drain_queue.front());
319+
}
312320
{
313321
node::Mutex::ScopedLock lock(this->mutex);
314-
for (; !queue.empty(); queue.pop()) {
315-
call_js_cb(nullptr, nullptr, context, queue.front());
316-
}
317322
if (thread_count > 0) {
318323
// At this point this TSFN is effectively done, but we need to keep
319324
// it alive for other threads that still have pointers to it until
320325
// they release them.
321326
// But we already release all the resources that we can at this point
322-
queue = {};
323327
ReleaseResources();
324328
return;
325329
}

0 commit comments

Comments
 (0)