Skip to content

Commit dd0fc46

Browse files
committed
node-api: optimize finalizer queue using container swap
1 parent 964e41c commit dd0fc46

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/node_api.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,16 @@ void node_napi_env__::EnqueueFinalizer(v8impl::RefTracker* finalizer) {
6767
}
6868

6969
void node_napi_env__::DrainFinalizerQueue() {
70-
// As userland code can delete additional references in one finalizer,
71-
// the list of pending finalizers may be mutated as we execute them, so
72-
// we keep iterating it until it is empty.
73-
while (!pending_finalizers.empty()) {
74-
v8impl::RefTracker* ref_tracker = *pending_finalizers.begin();
75-
pending_finalizers.erase(ref_tracker);
70+
decltype(pending_finalizers) current_finalizers;
71+
current_finalizers.swap(pending_finalizers);
72+
73+
for (auto* ref_tracker : current_finalizers) {
7674
ref_tracker->Finalize();
7775
}
76+
77+
if (!pending_finalizers.empty()) {
78+
DrainFinalizerQueue();
79+
}
7880
}
7981

8082
void node_napi_env__::trigger_fatal_exception(v8::Local<v8::Value> local_err) {

0 commit comments

Comments
 (0)