@@ -1022,33 +1022,10 @@ void Environment::RunCleanup() {
10221022 bindings_.clear ();
10231023 CleanupHandles ();
10241024
1025- while (!cleanup_hooks_.empty () ||
1026- native_immediates_.size () > 0 ||
1025+ while (!cleanup_queue_.empty () || native_immediates_.size () > 0 ||
10271026 native_immediates_threadsafe_.size () > 0 ||
10281027 native_immediates_interrupts_.size () > 0 ) {
1029- // Copy into a vector, since we can't sort an unordered_set in-place.
1030- std::vector<CleanupHookCallback> callbacks (
1031- cleanup_hooks_.begin (), cleanup_hooks_.end ());
1032- // We can't erase the copied elements from `cleanup_hooks_` yet, because we
1033- // need to be able to check whether they were un-scheduled by another hook.
1034-
1035- std::sort (callbacks.begin (), callbacks.end (),
1036- [](const CleanupHookCallback& a, const CleanupHookCallback& b) {
1037- // Sort in descending order so that the most recently inserted callbacks
1038- // are run first.
1039- return a.insertion_order_counter_ > b.insertion_order_counter_ ;
1040- });
1041-
1042- for (const CleanupHookCallback& cb : callbacks) {
1043- if (cleanup_hooks_.count (cb) == 0 ) {
1044- // This hook was removed from the `cleanup_hooks_` set during another
1045- // hook that was run earlier. Nothing to do here.
1046- continue ;
1047- }
1048-
1049- cb.fn_ (cb.arg_ );
1050- cleanup_hooks_.erase (cb);
1051- }
1028+ cleanup_queue_.Drain ();
10521029 CleanupHandles ();
10531030 }
10541031
@@ -1847,10 +1824,6 @@ void Environment::BuildEmbedderGraph(Isolate* isolate,
18471824 MemoryTracker tracker (isolate, graph);
18481825 Environment* env = static_cast <Environment*>(data);
18491826 tracker.Track (env);
1850- env->ForEachBaseObject ([&](BaseObject* obj) {
1851- if (obj->IsDoneInitializing ())
1852- tracker.Track (obj);
1853- });
18541827}
18551828
18561829size_t Environment::NearHeapLimitCallback (void * data,
@@ -1985,6 +1958,7 @@ inline size_t Environment::SelfSize() const {
19851958 // this can be done for common types within the Track* calls automatically
19861959 // if a certain scope is entered.
19871960 size -= sizeof (async_hooks_);
1961+ size -= sizeof (cleanup_queue_);
19881962 size -= sizeof (tick_info_);
19891963 size -= sizeof (immediate_info_);
19901964 return size;
@@ -2002,8 +1976,7 @@ void Environment::MemoryInfo(MemoryTracker* tracker) const {
20021976 tracker->TrackField (" should_abort_on_uncaught_toggle" ,
20031977 should_abort_on_uncaught_toggle_);
20041978 tracker->TrackField (" stream_base_state" , stream_base_state_);
2005- tracker->TrackFieldWithSize (
2006- " cleanup_hooks" , cleanup_hooks_.size () * sizeof (CleanupHookCallback));
1979+ tracker->TrackField (" cleanup_queue" , cleanup_queue_);
20071980 tracker->TrackField (" async_hooks" , async_hooks_);
20081981 tracker->TrackField (" immediate_info" , immediate_info_);
20091982 tracker->TrackField (" tick_info" , tick_info_);
0 commit comments