1#include <assert.h> 2#include <stdlib.h> 3#include "../../js-native-api/common.h" 4#include "node_api.h" 5#include "uv.h" 6 7static int cleanup_hook_count = 0; 8static void cleanup(void* arg) { 9 cleanup_hook_count++; 10 printf("cleanup(%d)\n", *(int*)(arg)); 11} 12 13static int secret = 42; 14static int wrong_secret = 17; 15 16static void ObjectFinalizer(napi_env env, void* data, void* hint) { 17 // cleanup is called once. 18 assert(cleanup_hook_count == 1); 19 20 napi_ref* ref = data; 21 NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, *ref)); 22 free(ref); 23} 24 25static void CreateObjectWrap(napi_env env) { 26 napi_value js_obj; 27 napi_ref* ref = malloc(sizeof(*ref)); 28 NODE_API_CALL_RETURN_VOID(env, napi_create_object(env, &js_obj)); 29 NODE_API_CALL_RETURN_VOID( 30 env, napi_wrap(env, js_obj, ref, ObjectFinalizer, NULL, ref)); 31 // create a strong reference so that the finalizer is called at shutdown. 32 NODE_API_CALL_RETURN_VOID(env, napi_reference_ref(env, *ref, NULL)); 33} 34 35static napi_value Init(napi_env env, napi_value exports) { 36 // Create object wrap before cleanup hooks. 37 CreateObjectWrap(env); 38 39 napi_add_env_cleanup_hook(env, cleanup, &wrong_secret); 40 napi_add_env_cleanup_hook(env, cleanup, &secret); 41 napi_remove_env_cleanup_hook(env, cleanup, &wrong_secret); 42 43 // Create object wrap after cleanup hooks. 44 CreateObjectWrap(env); 45 46 return NULL; 47} 48 49NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) 50