node-api: make tsfn accept napi_finalize once more

The thread-safe function's finalizer is not called in conjunction with
the garbage collection of a JS value. In fact, it keeps a strong
reference to the JS function it is expected to call. Thus, it is safe
to make calls that affect GC state from its body.

PR-URL: https://github.com/nodejs/node/pull/51801
Reviewed-By: Michael Dawson <midawson@redhat.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
This commit is contained in:
Gabriel Schulhof 2024-03-08 21:58:42 -08:00 committed by GitHub
parent 4e109e5958
commit f0e6acde2d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 3 additions and 17 deletions

View File

@ -1319,12 +1319,10 @@ napi_create_threadsafe_function(napi_env env,
size_t max_queue_size,
size_t initial_thread_count,
void* thread_finalize_data,
node_api_nogc_finalize nogc_thread_finalize_cb,
napi_finalize thread_finalize_cb,
void* context,
napi_threadsafe_function_call_js call_js_cb,
napi_threadsafe_function* result) {
napi_finalize thread_finalize_cb =
reinterpret_cast<napi_finalize>(nogc_thread_finalize_cb);
CHECK_ENV_NOT_IN_GC(env);
CHECK_ARG(env, async_resource_name);
RETURN_STATUS_IF_FALSE(env, initial_thread_count > 0, napi_invalid_arg);

View File

@ -209,7 +209,7 @@ napi_create_threadsafe_function(napi_env env,
size_t max_queue_size,
size_t initial_thread_count,
void* thread_finalize_data,
node_api_nogc_finalize thread_finalize_cb,
napi_finalize thread_finalize_cb,
void* context,
napi_threadsafe_function_call_js call_js_cb,
napi_threadsafe_function* result);

View File

@ -16,18 +16,6 @@ static void ThreadSafeFunctionFinalize(napi_env env,
NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, js_func_ref));
}
static void ThreadSafeFunctionNogcFinalize(node_api_nogc_env env,
void* data,
void* hint) {
#ifdef NAPI_EXPERIMENTAL
NODE_API_NOGC_CALL_RETURN_VOID(
env,
node_api_post_finalizer(env, ThreadSafeFunctionFinalize, data, hint));
#else
ThreadSafeFunctionFinalize(env, data, hint);
#endif
}
// Testing calling into JavaScript
static napi_value CallIntoModule(napi_env env, napi_callback_info info) {
size_t argc = 4;
@ -46,7 +34,7 @@ static napi_value CallIntoModule(napi_env env, napi_callback_info info) {
0,
1,
finalize_func,
ThreadSafeFunctionNogcFinalize,
ThreadSafeFunctionFinalize,
NULL,
NULL,
&tsfn));