@@ -1000,33 +1000,10 @@ void Environment::RunCleanup() {
1000
1000
bindings_.clear ();
1001
1001
CleanupHandles ();
1002
1002
1003
- while (!cleanup_hooks_.empty () ||
1004
- native_immediates_.size () > 0 ||
1003
+ while (!cleanup_queue_.empty () || native_immediates_.size () > 0 ||
1005
1004
native_immediates_threadsafe_.size () > 0 ||
1006
1005
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 ();
1030
1007
CleanupHandles ();
1031
1008
}
1032
1009
@@ -1730,10 +1707,6 @@ void Environment::BuildEmbedderGraph(Isolate* isolate,
1730
1707
MemoryTracker tracker (isolate, graph);
1731
1708
Environment* env = static_cast <Environment*>(data);
1732
1709
tracker.Track (env);
1733
- env->ForEachBaseObject ([&](BaseObject* obj) {
1734
- if (obj->IsDoneInitializing ())
1735
- tracker.Track (obj);
1736
- });
1737
1710
}
1738
1711
1739
1712
size_t Environment::NearHeapLimitCallback (void * data,
@@ -1868,6 +1841,7 @@ inline size_t Environment::SelfSize() const {
1868
1841
// this can be done for common types within the Track* calls automatically
1869
1842
// if a certain scope is entered.
1870
1843
size -= sizeof (async_hooks_);
1844
+ size -= sizeof (cleanup_queue_);
1871
1845
size -= sizeof (tick_info_);
1872
1846
size -= sizeof (immediate_info_);
1873
1847
return size;
@@ -1885,8 +1859,7 @@ void Environment::MemoryInfo(MemoryTracker* tracker) const {
1885
1859
tracker->TrackField (" should_abort_on_uncaught_toggle" ,
1886
1860
should_abort_on_uncaught_toggle_);
1887
1861
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_);
1890
1863
tracker->TrackField (" async_hooks" , async_hooks_);
1891
1864
tracker->TrackField (" immediate_info" , immediate_info_);
1892
1865
tracker->TrackField (" tick_info" , tick_info_);
0 commit comments