summaryrefslogtreecommitdiff
path: root/test_ffi/tests/thread_safe_test_worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'test_ffi/tests/thread_safe_test_worker.js')
-rw-r--r--test_ffi/tests/thread_safe_test_worker.js41
1 files changed, 41 insertions, 0 deletions
diff --git a/test_ffi/tests/thread_safe_test_worker.js b/test_ffi/tests/thread_safe_test_worker.js
new file mode 100644
index 000000000..067004469
--- /dev/null
+++ b/test_ffi/tests/thread_safe_test_worker.js
@@ -0,0 +1,41 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+// deno-lint-ignore-file
+
+const targetDir = Deno.execPath().replace(/[^\/\\]+$/, "");
+const [libPrefix, libSuffix] = {
+ darwin: ["lib", "dylib"],
+ linux: ["lib", "so"],
+ windows: ["", "dll"],
+}[Deno.build.os];
+const libPath = `${targetDir}/${libPrefix}test_ffi.${libSuffix}`;
+
+const dylib = Deno.dlopen(libPath, {
+ store_function: {
+ parameters: ["function"],
+ result: "void",
+ },
+ call_stored_function: {
+ parameters: [],
+ result: "void",
+ },
+});
+
+const callback = new Deno.UnsafeCallback(
+ { parameters: [], result: "void" },
+ () => {
+ console.log("Callback on worker thread");
+ },
+);
+
+callback.ref();
+
+self.addEventListener("message", ({ data }) => {
+ if (data === "register") {
+ dylib.symbols.store_function(callback.pointer);
+ } else if (data === "call") {
+ dylib.symbols.call_stored_function();
+ } else if (data === "unref") {
+ callback.unref();
+ }
+ self.postMessage("done");
+});