diff options
author | Aapo Alasuutari <aapo.alasuutari@gmail.com> | 2022-07-09 12:49:20 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-09 11:49:20 +0200 |
commit | 3da182b0b86d93000d4473188f361ffa2de9fb73 (patch) | |
tree | df401be6bbf20e051c25ef18c364278546d737bf /test_ffi/tests/event_loop_integration.ts | |
parent | 20cbd7f0f8f0e0ff4d6656f2fa7e93e01b8805f0 (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.ts | 64 |
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(); |