Skip to content

Commit 1aff25f

Browse files
committed
src: refactor weakref cleanup
1 parent 99c1238 commit 1aff25f

File tree

6 files changed

+30
-29
lines changed

6 files changed

+30
-29
lines changed

src/api/callback.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ void InternalCallbackScope::Close() {
101101

102102
if (!env_->can_call_into_js()) return;
103103

104-
OnScopeLeave weakref_cleanup([&]() { env_->RunWeakRefCleanup(); });
104+
OnScopeLeave weakref_cleanup([&]() { env_->isolate()->ClearKeptObjects(); });
105105

106106
if (!tick_info->has_tick_scheduled()) {
107107
MicrotasksScope::PerformCheckpoint(env_->isolate());

src/api/environment.cc

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ using v8::Context;
1414
using v8::EscapableHandleScope;
1515
using v8::FinalizationGroup;
1616
using v8::Function;
17+
using v8::Global;
1718
using v8::HandleScope;
1819
using v8::Isolate;
1920
using v8::Local;
@@ -77,13 +78,39 @@ static MaybeLocal<Value> PrepareStackTraceCallback(Local<Context> context,
7778
return result;
7879
}
7980

81+
class FinalizationGroupCleanupTask final {
82+
public:
83+
FinalizationGroupCleanupTask(Environment* env, Local<FinalizationGroup> group)
84+
: env_(env), group_(env->isolate(), group) {}
85+
86+
inline Environment* env() { return env_; }
87+
inline Local<FinalizationGroup> group() {
88+
return group_.Get(env_->isolate());
89+
}
90+
91+
private:
92+
Environment* env_;
93+
Global<FinalizationGroup> group_;
94+
};
95+
96+
void HostCleanupFinalizationGroupMicrotask(void* data) {
97+
FinalizationGroupCleanupTask* t =
98+
reinterpret_cast<FinalizationGroupCleanupTask*>(data);
99+
TryCatchScope try_catch(t->env());
100+
if (!FinalizationGroup::Cleanup(t->group()).FromMaybe(false)) {
101+
TriggerUncaughtException(t->env()->isolate(), try_catch);
102+
}
103+
}
104+
80105
static void HostCleanupFinalizationGroupCallback(
81106
Local<Context> context, Local<FinalizationGroup> group) {
82107
Environment* env = Environment::GetCurrent(context);
83108
if (env == nullptr) {
84109
return;
85110
}
86-
env->RegisterFinalizationGroupForCleanup(group);
111+
env->isolate()->EnqueueMicrotask(
112+
HostCleanupFinalizationGroupMicrotask,
113+
new FinalizationGroupCleanupTask(env, group));
87114
}
88115

89116
void* NodeArrayBufferAllocator::Allocate(size_t size) {

src/env-inl.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,11 +1115,6 @@ void Environment::RemoveCleanupHook(void (*fn)(void*), void* arg) {
11151115
cleanup_hooks_.erase(search);
11161116
}
11171117

1118-
inline void Environment::RegisterFinalizationGroupForCleanup(
1119-
v8::Local<v8::FinalizationGroup> group) {
1120-
cleanup_finalization_groups_.emplace_back(isolate(), group);
1121-
}
1122-
11231118
size_t CleanupHookCallback::Hash::operator()(
11241119
const CleanupHookCallback& cb) const {
11251120
return std::hash<void*>()(cb.arg_);

src/env.cc

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ using v8::ArrayBuffer;
2929
using v8::Boolean;
3030
using v8::Context;
3131
using v8::EmbedderGraph;
32-
using v8::FinalizationGroup;
3332
using v8::Function;
3433
using v8::FunctionTemplate;
3534
using v8::HandleScope;
@@ -1052,21 +1051,6 @@ void Environment::AddArrayBufferAllocatorToKeepAliveUntilIsolateDispose(
10521051
keep_alive_allocators_->insert(allocator);
10531052
}
10541053

1055-
bool Environment::RunWeakRefCleanup() {
1056-
isolate()->ClearKeptObjects();
1057-
1058-
while (!cleanup_finalization_groups_.empty()) {
1059-
Local<FinalizationGroup> fg =
1060-
cleanup_finalization_groups_.front().Get(isolate());
1061-
cleanup_finalization_groups_.pop_front();
1062-
if (!FinalizationGroup::Cleanup(fg).FromMaybe(false)) {
1063-
return false;
1064-
}
1065-
}
1066-
1067-
return true;
1068-
}
1069-
10701054
void AsyncRequest::Install(Environment* env, void* data, uv_async_cb target) {
10711055
CHECK_NULL(async_);
10721056
env_ = env;

src/env.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,9 +1132,6 @@ class Environment : public MemoryRetainer {
11321132
void AtExit(void (*cb)(void* arg), void* arg);
11331133
void RunAtExitCallbacks();
11341134

1135-
void RegisterFinalizationGroupForCleanup(v8::Local<v8::FinalizationGroup> fg);
1136-
bool RunWeakRefCleanup();
1137-
11381135
// Strings and private symbols are shared across shared contexts
11391136
// The getters simply proxy to the per-isolate primitive.
11401137
#define VP(PropertyName, StringValue) V(v8::Private, PropertyName)
@@ -1341,8 +1338,6 @@ class Environment : public MemoryRetainer {
13411338
uint64_t thread_id_;
13421339
std::unordered_set<worker::Worker*> sub_worker_contexts_;
13431340

1344-
std::deque<v8::Global<v8::FinalizationGroup>> cleanup_finalization_groups_;
1345-
13461341
static void* const kNodeContextTagPtr;
13471342
static int const kNodeContextTag;
13481343

src/node_task_queue.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static void EnqueueMicrotask(const FunctionCallbackInfo<Value>& args) {
4343

4444
// Should be in sync with runNextTicks in internal/process/task_queues.js
4545
bool RunNextTicksNative(Environment* env) {
46-
OnScopeLeave weakref_cleanup([&]() { env->RunWeakRefCleanup(); });
46+
OnScopeLeave weakref_cleanup([&]() { env->isolate()->ClearKeptObjects(); });
4747

4848
TickInfo* tick_info = env->tick_info();
4949
if (!tick_info->has_tick_scheduled() && !tick_info->has_rejection_to_warn())

0 commit comments

Comments
 (0)