mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
node-api: segregate nogc APIs from rest via type system
We define a new type called `node_api_nogc_env` as the `const` version of `napi_env` and `node_api_nogc_finalize` as a variant of `napi_finalize` that accepts a `node_api_nogc_env` as its first argument. We then modify those APIs which do not affect GC state as accepting a `node_api_nogc_env`. APIs accepting finalizer callbacks are modified to accept `node_api_nogc_finalize` callbacks. Thus, the only way to attach a `napi_finalize` callback, wherein Node-APIs affecting GC state may be called is to call `node_api_post_finalizer` from a `node_api_nogc_finalize` callback. In keeping with the process of introducing new Node-APIs, this feature is guarded by `NAPI_EXPERIMENTAL`. Since this feature modifies APIs already marked as stable, it is additionally guared by `NODE_API_EXPERIMENTAL_NOGC_ENV`, so as to provide a further buffer to adoption. Nevertheless, both guards must be removed upon releasing a new version of Node-API. PR-URL: https://github.com/nodejs/node/pull/50060 Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Vladimir Morozov <vmorozov@microsoft.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
This commit is contained in:
@@ -16,6 +16,18 @@ 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;
|
||||
@@ -34,7 +46,7 @@ static napi_value CallIntoModule(napi_env env, napi_callback_info info) {
|
||||
0,
|
||||
1,
|
||||
finalize_func,
|
||||
ThreadSafeFunctionFinalize,
|
||||
ThreadSafeFunctionNogcFinalize,
|
||||
NULL,
|
||||
NULL,
|
||||
&tsfn));
|
||||
|
||||
Reference in New Issue
Block a user