Skip to content

Commit e9fec8b

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

File tree

1 file changed

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

1 file changed

+15
-31
lines changed

test/node-api/test_threadsafe_function_abort/binding.cc

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
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>
9+
#include <utility>
910

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

3233
class Context {
3334
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-
};
35+
enum class State { kCreated, kCalled } state = State::kCreated;
5036
};
5137

52-
void tsfn_callback(napi_env env, napi_value js_cb, void* ctx_p, void* data) {
38+
void tsfn_callback(napi_env env,
39+
napi_value js_cb,
40+
void* ctx_p,
41+
void* /* data */) {
5342
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);
43+
assert(ctx->state == Context::State::kCreated);
44+
ctx->state = Context::State::kCalled;
5645
}
5746

58-
void tsfn_finalize(napi_env env, void* finalize_data, void* finalize_hint) {
47+
void tsfn_finalize(napi_env env,
48+
void* /* finalize_data */,
49+
void* finalize_hint) {
5950
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);
51+
assert(ctx->state == Context::State::kCalled);
6552
delete ctx;
6653
}
6754

@@ -82,11 +69,8 @@ auto run(napi_env env, napi_callback_info info) -> napi_value {
8269
ctx,
8370
tsfn_callback);
8471

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

9175
NAPI_CALL(void, napi_unref_threadsafe_function, env, tsfn);
9276

0 commit comments

Comments
 (0)