#include #include #include "../../js-native-api/common.h" #include "node_api.h" #include "uv.h" static int cleanup_hook_count = 0; static void cleanup(void* arg) { cleanup_hook_count++; printf("cleanup(%d)\n", *(int*)(arg)); } static int secret = 42; static int wrong_secret = 17; static void ObjectFinalizer(napi_env env, void* data, void* hint) { // cleanup is called once. assert(cleanup_hook_count == 1); napi_ref* ref = data; NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, *ref)); free(ref); } static void CreateObjectWrap(napi_env env) { napi_value js_obj; napi_ref* ref = malloc(sizeof(*ref)); NODE_API_CALL_RETURN_VOID(env, napi_create_object(env, &js_obj)); NODE_API_CALL_RETURN_VOID( env, napi_wrap(env, js_obj, ref, ObjectFinalizer, NULL, ref)); // create a strong reference so that the finalizer is called at shutdown. NODE_API_CALL_RETURN_VOID(env, napi_reference_ref(env, *ref, NULL)); } static napi_value Init(napi_env env, napi_value exports) { // Create object wrap before cleanup hooks. CreateObjectWrap(env); napi_add_env_cleanup_hook(env, cleanup, &wrong_secret); napi_add_env_cleanup_hook(env, cleanup, &secret); napi_remove_env_cleanup_hook(env, cleanup, &wrong_secret); // Create object wrap after cleanup hooks. CreateObjectWrap(env); return NULL; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)