diff --git a/src/api/environment.cc b/src/api/environment.cc index b9ca6ca7451926..2b7a7023b5f33c 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -16,7 +16,6 @@ using errors::TryCatchScope; using v8::Array; using v8::Context; using v8::EscapableHandleScope; -using v8::FinalizationGroup; using v8::Function; using v8::FunctionCallbackInfo; using v8::HandleScope; @@ -82,15 +81,6 @@ static MaybeLocal PrepareStackTraceCallback(Local context, return result; } -static void HostCleanupFinalizationGroupCallback( - Local context, Local group) { - Environment* env = Environment::GetCurrent(context); - if (env == nullptr) { - return; - } - env->RegisterFinalizationGroupForCleanup(group); -} - void* NodeArrayBufferAllocator::Allocate(size_t size) { void* ret; if (zero_fill_field_ || per_process::cli_options->zero_fill_all_buffers) @@ -259,11 +249,6 @@ void SetIsolateMiscHandlers(v8::Isolate* isolate, const IsolateSettings& s) { s.promise_reject_callback : task_queue::PromiseRejectCallback; isolate->SetPromiseRejectCallback(promise_reject_cb); - auto* host_cleanup_cb = s.host_cleanup_finalization_group_callback ? - s.host_cleanup_finalization_group_callback : - HostCleanupFinalizationGroupCallback; - isolate->SetHostCleanupFinalizationGroupCallback(host_cleanup_cb); - if (s.flags & DETAILED_SOURCE_POSITIONS_FOR_PROFILING) v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate); } diff --git a/src/env-inl.h b/src/env-inl.h index 5e8f3b5b02db54..3d7bd79852c028 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -1112,13 +1112,6 @@ void Environment::RemoveCleanupHook(void (*fn)(void*), void* arg) { cleanup_hooks_.erase(search); } -inline void Environment::RegisterFinalizationGroupForCleanup( - v8::Local group) { - cleanup_finalization_groups_.emplace_back(isolate(), group); - DCHECK(task_queues_async_initialized_); - uv_async_send(&task_queues_async_); -} - size_t CleanupHookCallback::Hash::operator()( const CleanupHookCallback& cb) const { return std::hash()(cb.arg_); diff --git a/src/env.cc b/src/env.cc index 06e6fe6f793536..b83bd62835128c 100644 --- a/src/env.cc +++ b/src/env.cc @@ -31,7 +31,6 @@ using v8::ArrayBuffer; using v8::Boolean; using v8::Context; using v8::EmbedderGraph; -using v8::FinalizationGroup; using v8::Function; using v8::FunctionTemplate; using v8::HandleScope; @@ -523,7 +522,6 @@ void Environment::InitializeLibuv(bool start_profiler_idle_notifier) { [](uv_async_t* async) { Environment* env = ContainerOf( &Environment::task_queues_async_, async); - env->CleanupFinalizationGroups(); env->RunAndClearNativeImmediates(); }); uv_unref(reinterpret_cast(&idle_prepare_handle_)); @@ -1158,26 +1156,6 @@ void Environment::RunWeakRefCleanup() { isolate()->ClearKeptObjects(); } -void Environment::CleanupFinalizationGroups() { - HandleScope handle_scope(isolate()); - Context::Scope context_scope(context()); - TryCatchScope try_catch(this); - - while (!cleanup_finalization_groups_.empty() && can_call_into_js()) { - Local fg = - cleanup_finalization_groups_.front().Get(isolate()); - cleanup_finalization_groups_.pop_front(); - if (!FinalizationGroup::Cleanup(fg).FromMaybe(false)) { - if (try_catch.HasCaught() && !try_catch.HasTerminated()) - errors::TriggerUncaughtException(isolate(), try_catch); - // Re-schedule the execution of the remainder of the queue. - CHECK(task_queues_async_initialized_); - uv_async_send(&task_queues_async_); - return; - } - } -} - // Not really any better place than env.cc at this moment. void BaseObject::DeleteMe(void* data) { BaseObject* self = static_cast(data); diff --git a/src/env.h b/src/env.h index 6df5fea44e3864..b1a2c97352c306 100644 --- a/src/env.h +++ b/src/env.h @@ -1105,9 +1105,7 @@ class Environment : public MemoryRetainer { void AtExit(void (*cb)(void* arg), void* arg); void RunAtExitCallbacks(); - void RegisterFinalizationGroupForCleanup(v8::Local fg); void RunWeakRefCleanup(); - void CleanupFinalizationGroups(); // Strings and private symbols are shared across shared contexts // The getters simply proxy to the per-isolate primitive. @@ -1331,8 +1329,6 @@ class Environment : public MemoryRetainer { uint64_t thread_id_; std::unordered_set sub_worker_contexts_; - std::deque> cleanup_finalization_groups_; - static void* const kNodeContextTagPtr; static int const kNodeContextTag; diff --git a/src/node.h b/src/node.h index 7fbbdb7ea23601..610d72ba8bf6ba 100644 --- a/src/node.h +++ b/src/node.h @@ -351,8 +351,6 @@ struct IsolateSettings { v8::PromiseRejectCallback promise_reject_callback = nullptr; v8::AllowWasmCodeGenerationCallback allow_wasm_code_generation_callback = nullptr; - v8::HostCleanupFinalizationGroupCallback - host_cleanup_finalization_group_callback = nullptr; }; // Overriding IsolateSettings may produce unexpected behavior diff --git a/test/parallel/test-finalization-group-error.js b/test/parallel/test-finalization-group-error.js deleted file mode 100644 index 0685811f55b7f8..00000000000000 --- a/test/parallel/test-finalization-group-error.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -// Flags: --expose-gc --harmony-weak-refs - -const common = require('../common'); -const assert = require('assert'); - -const g = new globalThis.FinalizationGroup(common.mustCallAtLeast(() => { - throw new Error('test'); -}, 1)); -g.register({}, 42); - -setTimeout(() => { - globalThis.gc(); - assert.throws(() => { - g.cleanupSome(); - }, { - name: 'Error', - message: 'test', - }); - - // Give the callbacks scheduled by global.gc() time to run, as the underlying - // uv_async_t is unref’ed. - setTimeout(() => {}, 200); -}, 200); - -process.on('uncaughtException', common.mustCall()); diff --git a/test/parallel/test-finalization-group-regular-gc.js b/test/parallel/test-finalization-group-regular-gc.js deleted file mode 100644 index 7a4a4797eadcf0..00000000000000 --- a/test/parallel/test-finalization-group-regular-gc.js +++ /dev/null @@ -1,25 +0,0 @@ -// Flags: --harmony-weak-refs -'use strict'; -require('../common'); -const assert = require('assert'); - -// Test that finalization callbacks do not crash when caused through a regular -// GC (not global.gc()). - -const start = Date.now(); -const g = new globalThis.FinalizationGroup(() => { - const diff = Date.now() - start; - assert(diff < 10000, `${diff} >= 10000`); -}); -g.register({}, 42); - -setImmediate(() => { - const arr = []; - // Build up enough memory usage to hopefully trigger a platform task but not - // enough to trigger GC as an interrupt. - while (arr.length < 1000000) arr.push([]); - - setTimeout(() => { - g; // Keep reference alive. - }, 200000).unref(); -}); diff --git a/test/parallel/test-finalization-group.js b/test/parallel/test-finalization-group.js deleted file mode 100644 index 3e6b9d72e35648..00000000000000 --- a/test/parallel/test-finalization-group.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -// Flags: --expose-gc --harmony-weak-refs - -const common = require('../common'); - -const g = new globalThis.FinalizationGroup(common.mustCallAtLeast(1)); -g.register({}, 42); - -setTimeout(() => { - globalThis.gc(); - g.cleanupSome(); -}, 200);