@@ -1000,33 +1000,10 @@ void Environment::RunCleanup() {
10001000 bindings_.clear ();
10011001 CleanupHandles ();
10021002
1003- while (!cleanup_hooks_.empty () ||
1004- native_immediates_.size () > 0 ||
1003+ while (!cleanup_queue_.empty () || native_immediates_.size () > 0 ||
10051004 native_immediates_threadsafe_.size () > 0 ||
10061005 native_immediates_interrupts_.size () > 0 ) {
1007- // Copy into a vector, since we can't sort an unordered_set in-place.
1008- std::vector<CleanupHookCallback> callbacks (
1009- cleanup_hooks_.begin (), cleanup_hooks_.end ());
1010- // We can't erase the copied elements from `cleanup_hooks_` yet, because we
1011- // need to be able to check whether they were un-scheduled by another hook.
1012-
1013- std::sort (callbacks.begin (), callbacks.end (),
1014- [](const CleanupHookCallback& a, const CleanupHookCallback& b) {
1015- // Sort in descending order so that the most recently inserted callbacks
1016- // are run first.
1017- return a.insertion_order_counter_ > b.insertion_order_counter_ ;
1018- });
1019-
1020- for (const CleanupHookCallback& cb : callbacks) {
1021- if (cleanup_hooks_.count (cb) == 0 ) {
1022- // This hook was removed from the `cleanup_hooks_` set during another
1023- // hook that was run earlier. Nothing to do here.
1024- continue ;
1025- }
1026-
1027- cb.fn_ (cb.arg_ );
1028- cleanup_hooks_.erase (cb);
1029- }
1006+ cleanup_queue_.Drain ();
10301007 CleanupHandles ();
10311008 }
10321009
@@ -1730,10 +1707,6 @@ void Environment::BuildEmbedderGraph(Isolate* isolate,
17301707 MemoryTracker tracker (isolate, graph);
17311708 Environment* env = static_cast <Environment*>(data);
17321709 tracker.Track (env);
1733- env->ForEachBaseObject ([&](BaseObject* obj) {
1734- if (obj->IsDoneInitializing ())
1735- tracker.Track (obj);
1736- });
17371710}
17381711
17391712size_t Environment::NearHeapLimitCallback (void * data,
@@ -1868,6 +1841,7 @@ inline size_t Environment::SelfSize() const {
18681841 // this can be done for common types within the Track* calls automatically
18691842 // if a certain scope is entered.
18701843 size -= sizeof (async_hooks_);
1844+ size -= sizeof (cleanup_queue_);
18711845 size -= sizeof (tick_info_);
18721846 size -= sizeof (immediate_info_);
18731847 return size;
@@ -1885,8 +1859,7 @@ void Environment::MemoryInfo(MemoryTracker* tracker) const {
18851859 tracker->TrackField (" should_abort_on_uncaught_toggle" ,
18861860 should_abort_on_uncaught_toggle_);
18871861 tracker->TrackField (" stream_base_state" , stream_base_state_);
1888- tracker->TrackFieldWithSize (
1889- " cleanup_hooks" , cleanup_hooks_.size () * sizeof (CleanupHookCallback));
1862+ tracker->TrackField (" cleanup_queue" , cleanup_queue_);
18901863 tracker->TrackField (" async_hooks" , async_hooks_);
18911864 tracker->TrackField (" immediate_info" , immediate_info_);
18921865 tracker->TrackField (" tick_info" , tick_info_);
0 commit comments