From 75acec0aea3eb39afe9240d7952cc6106363c8de Mon Sep 17 00:00:00 2001 From: Aapo Alasuutari Date: Sat, 15 Oct 2022 16:49:46 +0300 Subject: fix(ext/ffi): Fix UnsafeCallback ref'ing making Deno enter a live-loop (#16216) Fixes #15136 Currently `UnsafeCallback` class' `ref()` and `unref()` methods rely on the `event_loop_middleware` implementation in core. If even a single `UnsafeCallback` is ref'ed, then the FFI event loop middleware will always return `true` to signify that there may still be more work for the event loop to do. The middleware handling in core does not wait a moment to check again, but will instead synchronously directly re-poll the event loop and middlewares for more work. This becomes a live-loop. This PR introduces a `Future` implementation for the `CallbackInfo` struct that acts as the intermediary data storage between an `UnsafeCallback` and the `libffi` C callback. Ref'ing a callback now means calling an async op that binds to the `CallbackInfo` Future and only resolves once the callback is unref'ed. The `libffi` C callback will call the waker of this Future when it fires to make sure that the main thread wakes up to receive the callback. --- cli/dts/lib.deno.unstable.d.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'cli/dts') diff --git a/cli/dts/lib.deno.unstable.d.ts b/cli/dts/lib.deno.unstable.d.ts index a25c1011e..6eb7153ba 100644 --- a/cli/dts/lib.deno.unstable.d.ts +++ b/cli/dts/lib.deno.unstable.d.ts @@ -831,20 +831,22 @@ declare namespace Deno { >; /** - * Adds one to this callback's reference counting. + * Adds one to this callback's reference counting and returns the + * new reference count. * * If the callback's reference count becomes non-zero, it will keep * Deno's process from exiting. */ - ref(): void; + ref(): number; /** - * Removes one from this callback's reference counting. + * Removes one from this callback's reference counting and returns + * the new reference count. * * If the callback's reference counter becomes zero, it will no longer * keep Deno's process from exiting. */ - unref(): void; + unref(): number; /** * Removes the C function pointer associated with the UnsafeCallback. -- cgit v1.2.3