summaryrefslogtreecommitdiff
path: root/test_ffi/tests/event_loop_integration.ts
diff options
context:
space:
mode:
authorAapo Alasuutari <aapo.alasuutari@gmail.com>2022-07-09 12:49:20 +0300
committerGitHub <noreply@github.com>2022-07-09 11:49:20 +0200
commit3da182b0b86d93000d4473188f361ffa2de9fb73 (patch)
treedf401be6bbf20e051c25ef18c364278546d737bf /test_ffi/tests/event_loop_integration.ts
parent20cbd7f0f8f0e0ff4d6656f2fa7e93e01b8805f0 (diff)
fix(ext/ffi): Avoid keeping JsRuntimeState RefCell borrowed for event loop middleware calls (#15116)
Diffstat (limited to 'test_ffi/tests/event_loop_integration.ts')
-rw-r--r--test_ffi/tests/event_loop_integration.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/test_ffi/tests/event_loop_integration.ts b/test_ffi/tests/event_loop_integration.ts
new file mode 100644
index 000000000..c3b34cc8f
--- /dev/null
+++ b/test_ffi/tests/event_loop_integration.ts
@@ -0,0 +1,64 @@
+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_and_log: {
+ parameters: [],
+ result: "void",
+ },
+ } as const,
+);
+
+const tripleLogCallback = () => {
+ console.log("Sync");
+ Promise.resolve().then(() => {
+ console.log("Async");
+ callback.unref();
+ });
+ setTimeout(() => {
+ console.log("Timeout");
+ callback.unref();
+ }, 10);
+};
+
+const callback = new Deno.UnsafeCallback(
+ {
+ parameters: [],
+ result: "void",
+ } as const,
+ tripleLogCallback,
+);
+
+// Store function
+dylib.symbols.store_function(callback.pointer);
+
+// Synchronous callback logging
+console.log("SYNCHRONOUS");
+dylib.symbols.call_stored_function();
+console.log("STORED_FUNCTION called");
+
+// Wait to make sure synch logging and async logging
+await new Promise((res) => setTimeout(res, 100));
+
+// Ref twice to make sure both `Promise.resolve().then()` and `setTimeout()`
+// must resolve before isolate exists.
+callback.ref();
+callback.ref();
+
+console.log("THREAD SAFE");
+dylib.symbols.call_stored_function_thread_safe_and_log();