summaryrefslogtreecommitdiff
path: root/test/node-api/test_threadsafe_function/binding.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/node-api/test_threadsafe_function/binding.c')
-rw-r--r--test/node-api/test_threadsafe_function/binding.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/test/node-api/test_threadsafe_function/binding.c b/test/node-api/test_threadsafe_function/binding.c
index c9c5261538..9f2fa5f9bd 100644
--- a/test/node-api/test_threadsafe_function/binding.c
+++ b/test/node-api/test_threadsafe_function/binding.c
@@ -267,6 +267,60 @@ static napi_value StartThreadNoJsFunc(napi_env env, napi_callback_info info) {
/** block_on_full */true, /** alt_ref_js_cb */true);
}
+static void DeadlockTestDummyMarshaller(napi_env env,
+ napi_value empty0,
+ void* empty1,
+ void* empty2) {}
+
+static napi_value TestDeadlock(napi_env env, napi_callback_info info) {
+ napi_threadsafe_function tsfn;
+ napi_status status;
+ napi_value async_name;
+ napi_value return_value;
+
+ // Create an object to store the returned information.
+ NAPI_CALL(env, napi_create_object(env, &return_value));
+
+ // Create a string to be used with the thread-safe function.
+ NAPI_CALL(env, napi_create_string_utf8(env,
+ "N-API Thread-safe Function Deadlock Test",
+ NAPI_AUTO_LENGTH,
+ &async_name));
+
+ // Create the thread-safe function with a single queue slot and a single thread.
+ NAPI_CALL(env, napi_create_threadsafe_function(env,
+ NULL,
+ NULL,
+ async_name,
+ 1,
+ 1,
+ NULL,
+ NULL,
+ NULL,
+ DeadlockTestDummyMarshaller,
+ &tsfn));
+
+ // Call the threadsafe function. This should succeed and fill the queue.
+ NAPI_CALL(env, napi_call_threadsafe_function(tsfn, NULL, napi_tsfn_blocking));
+
+ // Call the threadsafe function. This should not block, but return
+ // `napi_would_deadlock`. We save the resulting status in an object to be
+ // returned.
+ status = napi_call_threadsafe_function(tsfn, NULL, napi_tsfn_blocking);
+ add_returned_status(env,
+ "deadlockTest",
+ return_value,
+ "Main thread would deadlock",
+ napi_would_deadlock,
+ status);
+
+ // Clean up the thread-safe function before returning.
+ NAPI_CALL(env, napi_release_threadsafe_function(tsfn, napi_tsfn_release));
+
+ // Return the result.
+ return return_value;
+}
+
// Module init
static napi_value Init(napi_env env, napi_value exports) {
size_t index;
@@ -305,6 +359,7 @@ static napi_value Init(napi_env env, napi_value exports) {
DECLARE_NAPI_PROPERTY("StopThread", StopThread),
DECLARE_NAPI_PROPERTY("Unref", Unref),
DECLARE_NAPI_PROPERTY("Release", Release),
+ DECLARE_NAPI_PROPERTY("TestDeadlock", TestDeadlock),
};
NAPI_CALL(env, napi_define_properties(env, exports,