diff options
author | Matt Mastracci <matthew@mastracci.com> | 2024-02-12 13:46:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-12 13:46:50 -0700 |
commit | f60720090c7bd8cdf91d7aebd0c42e01c86b3b83 (patch) | |
tree | 9becb7ff7e40d37769601fa049beccd101d58a98 /test_ffi/tests/thread_safe_test.js | |
parent | bd1358efab8ba7339a8e70034315fa7da840292e (diff) |
chore: move test_ffi and test_nap to tests/ [WIP] (#22394)
Moving some additional NAPI and. FFI tests out of the tree root.
Diffstat (limited to 'test_ffi/tests/thread_safe_test.js')
-rw-r--r-- | test_ffi/tests/thread_safe_test.js | 105 |
1 files changed, 0 insertions, 105 deletions
diff --git a/test_ffi/tests/thread_safe_test.js b/test_ffi/tests/thread_safe_test.js deleted file mode 100644 index fffa61a04..000000000 --- a/test_ffi/tests/thread_safe_test.js +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2018-2024 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", - }, - call_stored_function_thread_safe: { - parameters: [], - result: "void", - }, -}); - -let resolveWorker; -let workerResponsePromise; - -const worker = new Worker( - new URL("./thread_safe_test_worker.js", import.meta.url).href, - { type: "module" }, -); - -worker.addEventListener("message", () => { - if (resolveWorker) { - resolveWorker(); - } -}); - -const sendWorkerMessage = async (data) => { - workerResponsePromise = new Promise((res) => { - resolveWorker = res; - }); - worker.postMessage(data); - await workerResponsePromise; -}; - -// Test step 1: Register main thread callback, trigger on worker thread - -const mainThreadCallback = new Deno.UnsafeCallback( - { parameters: [], result: "void" }, - () => { - console.log("Callback on main thread"); - }, -); - -mainThreadCallback.ref(); - -dylib.symbols.store_function(mainThreadCallback.pointer); - -await sendWorkerMessage("call"); - -// Test step 2: Register on worker thread, trigger on main thread - -await sendWorkerMessage("register"); - -dylib.symbols.call_stored_function(); - -// Unref both main and worker thread callbacks and terminate the worker: Note, the stored function pointer in lib is now dangling. - -dylib.symbols.store_function(null); - -mainThreadCallback.unref(); -await sendWorkerMessage("unref"); -worker.terminate(); - -// Test step 3: Register a callback that will be the only thing left keeping the isolate from exiting. -// Rely on it to keep Deno running until the callback comes in and unrefs the callback, after which Deno should exit. - -const cleanupCallback = new Deno.UnsafeCallback( - { parameters: [], result: "void" }, - () => { - console.log("Callback being called"); - // Defer the cleanup to give the spawned thread all the time it needs to properly shut down - setTimeout(() => cleanup(), 100); - }, -); - -cleanupCallback.ref(); - -function cleanup() { - cleanupCallback.unref(); - dylib.symbols.store_function(null); - mainThreadCallback.close(); - cleanupCallback.close(); - console.log("Isolate should now exit"); -} - -dylib.symbols.store_function(cleanupCallback.pointer); - -console.log( - "Calling callback, isolate should stay asleep until callback is called", -); -dylib.symbols.call_stored_function_thread_safe(); |