|
| 1 | +#define NAPI_EXPERIMENTAL // napi_add_finalizer |
1 | 2 | #include <node_api.h> |
| 3 | +#include <assert.h> |
2 | 4 | #include "../../js-native-api/common.h" |
3 | 5 |
|
4 | 6 | #define MAX_ARGUMENTS 10 |
@@ -44,13 +46,40 @@ static napi_value MakeCallback(napi_env env, napi_callback_info info) { |
44 | 46 | return result; |
45 | 47 | } |
46 | 48 |
|
| 49 | +static void AsyncDestroyCb(napi_env env, void* data, void* hint) { |
| 50 | + napi_status status = napi_async_destroy(env, (napi_async_context)data); |
| 51 | + assert(status == napi_ok); |
| 52 | +} |
| 53 | + |
| 54 | +static napi_value CreateAsyncResource(napi_env env, napi_callback_info info) { |
| 55 | + napi_value object; |
| 56 | + NAPI_CALL(env, napi_create_object(env, &object)); |
| 57 | + |
| 58 | + napi_value resource_name; |
| 59 | + NAPI_CALL(env, napi_create_string_utf8( |
| 60 | + env, "test_gcable", NAPI_AUTO_LENGTH, &resource_name)); |
| 61 | + |
| 62 | + napi_async_context context; |
| 63 | + NAPI_CALL(env, napi_async_init(env, object, resource_name, &context)); |
| 64 | + |
| 65 | + NAPI_CALL(env, napi_add_finalizer( |
| 66 | + env, object, (void*)context, AsyncDestroyCb, NULL, NULL)); |
| 67 | + |
| 68 | + return object; |
| 69 | +} |
| 70 | + |
47 | 71 | static |
48 | 72 | napi_value Init(napi_env env, napi_value exports) { |
49 | 73 | napi_value fn; |
50 | 74 | NAPI_CALL(env, napi_create_function( |
51 | 75 | // NOLINTNEXTLINE (readability/null_usage) |
52 | 76 | env, NULL, NAPI_AUTO_LENGTH, MakeCallback, NULL, &fn)); |
53 | 77 | NAPI_CALL(env, napi_set_named_property(env, exports, "makeCallback", fn)); |
| 78 | + NAPI_CALL(env, napi_create_function( |
| 79 | + // NOLINTNEXTLINE (readability/null_usage) |
| 80 | + env, NULL, NAPI_AUTO_LENGTH, CreateAsyncResource, NULL, &fn)); |
| 81 | + NAPI_CALL(env, napi_set_named_property( |
| 82 | + env, exports, "createAsyncResource", fn)); |
54 | 83 | return exports; |
55 | 84 | } |
56 | 85 |
|
|
0 commit comments