Skip to content

Commit bc464e2

Browse files
committed
fixup! test: add node-api tsfn test with freed context after abort
1 parent d52e75c commit bc464e2

File tree

1 file changed

+14
-31
lines changed
  • test/node-api/test_threadsafe_function_abort

1 file changed

+14
-31
lines changed

test/node-api/test_threadsafe_function_abort/binding.cc

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
#include <node_api.h>
33
#include <node_api_types.h>
44

5+
#include <assert.h>
56
#include <cstdio>
67
#include <cstdlib>
7-
#include <functional>
88
#include <type_traits>
99

1010
template <typename R, auto func, typename... Args>
@@ -31,37 +31,23 @@ inline auto call(const char* name, Args&&... args) -> R {
3131

3232
class Context {
3333
public:
34-
~Context() { std::fprintf(stderr, "Context: destructor called\n"); }
35-
36-
std::function<int*(int)> create = [](int value) {
37-
std::fprintf(stderr, "Context: create called\n");
38-
return new int(value);
39-
};
40-
41-
std::function<int(void*)> get = [](void* ptr) {
42-
std::fprintf(stderr, "Context: get called\n");
43-
return *static_cast<int*>(ptr);
44-
};
45-
46-
std::function<void(void*)> deleter = [](void* ptr) {
47-
std::fprintf(stderr, "Context: deleter called\n");
48-
delete static_cast<int*>(ptr);
49-
};
34+
enum class State { kCreated, kCalled } state = State::kCreated;
5035
};
5136

52-
void tsfn_callback(napi_env env, napi_value js_cb, void* ctx_p, void* data) {
37+
void tsfn_callback(napi_env env,
38+
napi_value js_cb,
39+
void* ctx_p,
40+
void* /* data */) {
5341
auto ctx = static_cast<Context*>(ctx_p);
54-
std::fprintf(stderr, "tsfn_callback: env=%p data=%d\n", env, ctx->get(data));
55-
ctx->deleter(data);
42+
assert(ctx->state == Context::State::kCreated);
43+
ctx->state = Context::State::kCalled;
5644
}
5745

58-
void tsfn_finalize(napi_env env, void* finalize_data, void* finalize_hint) {
46+
void tsfn_finalize(napi_env env,
47+
void* /* finalize_data */,
48+
void* finalize_hint) {
5949
auto ctx = static_cast<Context*>(finalize_hint);
60-
std::fprintf(stderr,
61-
"tsfn_finalize: env=%p finalize_data=%p finalize_hint=%p\n",
62-
env,
63-
finalize_data,
64-
finalize_hint);
50+
assert(ctx->state == Context::State::kCalled);
6551
delete ctx;
6652
}
6753

@@ -82,11 +68,8 @@ auto run(napi_env env, napi_callback_info info) -> napi_value {
8268
ctx,
8369
tsfn_callback);
8470

85-
NAPI_CALL(void,
86-
napi_call_threadsafe_function,
87-
tsfn,
88-
ctx->create(1),
89-
napi_tsfn_blocking);
71+
NAPI_CALL(
72+
void, napi_call_threadsafe_function, tsfn, nullptr, napi_tsfn_blocking);
9073

9174
NAPI_CALL(void, napi_unref_threadsafe_function, env, tsfn);
9275

0 commit comments

Comments
 (0)