diff options
author | 2023-08-21 16:26:07 -0700 | |
---|---|---|
committer | 2023-08-21 16:26:07 -0700 | |
commit | 664119841a92d13a297e88032f9985fe7e35f77c (patch) | |
tree | 0fe664b158d2313d42bb20d6f10b795194a206bb /src/bun.js/bindings/napi.cpp | |
parent | 397182b400067be7b5293899fb3855524d07d8bf (diff) | |
download | bun-664119841a92d13a297e88032f9985fe7e35f77c.tar.gz bun-664119841a92d13a297e88032f9985fe7e35f77c.tar.zst bun-664119841a92d13a297e88032f9985fe7e35f77c.zip |
Implement `napi_ref_threadsafe_function` (#4156)
* Implement napi_ref_threadsafe_function
* work on this
* i hate event loops
* little better
* clean
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index 8a77723e2..2562242a8 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -46,6 +46,8 @@ #include "JavaScriptCore/JSSourceCode.h" #include "JavaScriptCore/JSNativeStdFunction.h" #include "JavaScriptCore/BigIntObject.h" +#include "ScriptExecutionContext.h" +#include "Strong.h" #include "../modules/ObjectModule.h" @@ -1763,7 +1765,16 @@ extern "C" napi_status napi_create_external(napi_env env, void* data, auto* structure = Bun::NapiExternal::createStructure(vm, globalObject, globalObject->objectPrototype()); JSValue value = JSValue(Bun::NapiExternal::create(vm, structure, data, finalize_hint, finalize_cb)); - JSC::EnsureStillAliveScope ensureStillAlive(value); + + // With `fsevents`, their napi_create_external seems to get immediatly garbage + // collected for some unknown reason. + // See https://github.com/oven-sh/bun/issues/3978 and `fsevents.test.ts` + JSC::Strong<Unknown>* strong = new JSC::Strong<Unknown>(vm, value); + globalObject->scriptExecutionContext()->postTask([strong](auto& context) -> void { + strong->clear(); + delete strong; + }); + *result = toNapi(value); return napi_ok; } |