Skip to content

Commit e522e44

Browse files
committed
node-api: execute tsfn finalizer after queue drains when aborted
A threadsafe function may utilize its context in its `call_js` callback. The context should be valid during draining of the queue when the threadsafe function is aborted. Fixes: #60026
1 parent da5efc4 commit e522e44

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

src/node_api.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ class ThreadSafeFunction {
308308
return napi_ok;
309309
}
310310

311-
void EmptyQueueAndMaybeDelete() {
311+
void EmptyQueue() {
312312
std::queue<void*> drain_queue;
313313
{
314314
node::Mutex::ScopedLock lock(this->mutex);
@@ -317,6 +317,9 @@ class ThreadSafeFunction {
317317
for (; !drain_queue.empty(); drain_queue.pop()) {
318318
call_js_cb(nullptr, nullptr, context, drain_queue.front());
319319
}
320+
}
321+
322+
void MaybeDelete() {
320323
{
321324
node::Mutex::ScopedLock lock(this->mutex);
322325
if (thread_count > 0) {
@@ -464,11 +467,12 @@ class ThreadSafeFunction {
464467

465468
void Finalize() {
466469
v8::HandleScope scope(env->isolate);
470+
EmptyQueue();
467471
if (finalize_cb) {
468472
AsyncResource::CallbackScope cb_scope(&*async_resource);
469473
env->CallFinalizer<false>(finalize_cb, finalize_data, context);
470474
}
471-
EmptyQueueAndMaybeDelete();
475+
MaybeDelete();
472476
}
473477

474478
void CloseHandlesAndMaybeDelete(bool set_closing = false) {

0 commit comments

Comments
 (0)