@@ -1022,33 +1022,10 @@ void Environment::RunCleanup() {
1022
1022
bindings_.clear ();
1023
1023
CleanupHandles ();
1024
1024
1025
- while (!cleanup_hooks_.empty () ||
1026
- native_immediates_.size () > 0 ||
1025
+ while (!cleanup_queue_.empty () || native_immediates_.size () > 0 ||
1027
1026
native_immediates_threadsafe_.size () > 0 ||
1028
1027
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 ();
1052
1029
CleanupHandles ();
1053
1030
}
1054
1031
@@ -1847,10 +1824,6 @@ void Environment::BuildEmbedderGraph(Isolate* isolate,
1847
1824
MemoryTracker tracker (isolate, graph);
1848
1825
Environment* env = static_cast <Environment*>(data);
1849
1826
tracker.Track (env);
1850
- env->ForEachBaseObject ([&](BaseObject* obj) {
1851
- if (obj->IsDoneInitializing ())
1852
- tracker.Track (obj);
1853
- });
1854
1827
}
1855
1828
1856
1829
size_t Environment::NearHeapLimitCallback (void * data,
@@ -1985,6 +1958,7 @@ inline size_t Environment::SelfSize() const {
1985
1958
// this can be done for common types within the Track* calls automatically
1986
1959
// if a certain scope is entered.
1987
1960
size -= sizeof (async_hooks_);
1961
+ size -= sizeof (cleanup_queue_);
1988
1962
size -= sizeof (tick_info_);
1989
1963
size -= sizeof (immediate_info_);
1990
1964
return size;
@@ -2002,8 +1976,7 @@ void Environment::MemoryInfo(MemoryTracker* tracker) const {
2002
1976
tracker->TrackField (" should_abort_on_uncaught_toggle" ,
2003
1977
should_abort_on_uncaught_toggle_);
2004
1978
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_);
2007
1980
tracker->TrackField (" async_hooks" , async_hooks_);
2008
1981
tracker->TrackField (" immediate_info" , immediate_info_);
2009
1982
tracker->TrackField (" tick_info" , tick_info_);
0 commit comments