Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Friends | List of all members
dart::GCMarker Class Reference

#include <marker.h>

Public Member Functions

 GCMarker (IsolateGroup *isolate_group, Heap *heap)
 
 ~GCMarker ()
 
void StartConcurrentMark (PageSpace *page_space)
 
void IncrementalMarkWithUnlimitedBudget (PageSpace *page_space)
 
void IncrementalMarkWithSizeBudget (PageSpace *page_space, intptr_t size)
 
void IncrementalMarkWithTimeBudget (PageSpace *page_space, int64_t deadline)
 
void MarkObjects (PageSpace *page_space)
 
intptr_t marked_words () const
 
intptr_t MarkedWordsPerMicro () const
 
void PruneWeak (Scavenger *scavenger)
 

Friends

class ConcurrentMarkTask
 
class ParallelMarkTask
 
class Scavenger
 
template<bool sync>
class MarkingVisitorBase
 

Detailed Description

Definition at line 32 of file marker.h.

Constructor & Destructor Documentation

◆ GCMarker()

dart::GCMarker::GCMarker ( IsolateGroup isolate_group,
Heap heap 
)

Definition at line 959 of file marker.cc.

960 : isolate_group_(isolate_group),
961 heap_(heap),
962 marking_stack_(),
963 new_marking_stack_(),
964 deferred_marking_stack_(),
965 global_list_(),
966 visitors_(),
967 marked_bytes_(0),
968 marked_micros_(0) {
969 visitors_ = new SyncMarkingVisitor*[FLAG_marker_tasks];
970 for (intptr_t i = 0; i < FLAG_marker_tasks; i++) {
971 visitors_[i] = nullptr;
972 }
973}
MarkingVisitorBase< true > SyncMarkingVisitor
Definition marker.cc:545

◆ ~GCMarker()

dart::GCMarker::~GCMarker ( )

Definition at line 975 of file marker.cc.

975 {
976 // Cleanup in case isolate shutdown happens after starting the concurrent
977 // marker and before finalizing.
978 if (isolate_group_->marking_stack() != nullptr) {
979 isolate_group_->DisableIncrementalBarrier();
980 for (intptr_t i = 0; i < FLAG_marker_tasks; i++) {
981 visitors_[i]->AbandonWork();
982 delete visitors_[i];
983 }
984 }
985 delete[] visitors_;
986}
void DisableIncrementalBarrier()
Definition isolate.cc:2791
MarkingStack * marking_stack() const
Definition isolate.h:570

Member Function Documentation

◆ IncrementalMarkWithSizeBudget()

void dart::GCMarker::IncrementalMarkWithSizeBudget ( PageSpace page_space,
intptr_t  size 
)

Definition at line 1066 of file marker.cc.

1067 {
1068 // Avoid setup overhead for tiny amounts of marking as the last bits of TLABs
1069 // get filled in.
1070 const intptr_t kMinimumMarkingStep = KB;
1071 if (size < kMinimumMarkingStep) return;
1072
1074 "IncrementalMarkWithSizeBudget");
1075
1076 SyncMarkingVisitor visitor(isolate_group_, page_space, &marking_stack_,
1077 &new_marking_stack_, &deferred_marking_stack_);
1079 visitor.ProcessMarkingStack(size);
1080 int64_t stop = OS::GetCurrentMonotonicMicros();
1081 visitor.AddMicros(stop - start);
1082 {
1083 MonitorLocker ml(page_space->tasks_lock());
1084 visitor.FinalizeIncremental(&global_list_);
1085 marked_bytes_ += visitor.marked_bytes();
1086 marked_micros_ += visitor.marked_micros();
1087 }
1088}
static int64_t GetCurrentMonotonicMicros()
static Thread * Current()
Definition thread.h:361
constexpr intptr_t KB
Definition globals.h:528
#define TIMELINE_FUNCTION_GC_DURATION(thread, name)
Definition timeline.h:41

◆ IncrementalMarkWithTimeBudget()

void dart::GCMarker::IncrementalMarkWithTimeBudget ( PageSpace page_space,
int64_t  deadline 
)

Definition at line 1090 of file marker.cc.

1091 {
1093 "IncrementalMarkWithTimeBudget");
1094
1095 SyncMarkingVisitor visitor(isolate_group_, page_space, &marking_stack_,
1096 &new_marking_stack_, &deferred_marking_stack_);
1098 visitor.ProcessMarkingStackUntil(deadline);
1099 int64_t stop = OS::GetCurrentMonotonicMicros();
1100 visitor.AddMicros(stop - start);
1101 {
1102 MonitorLocker ml(page_space->tasks_lock());
1103 visitor.FinalizeIncremental(&global_list_);
1104 marked_bytes_ += visitor.marked_bytes();
1105 marked_micros_ += visitor.marked_micros();
1106 }
1107}

◆ IncrementalMarkWithUnlimitedBudget()

void dart::GCMarker::IncrementalMarkWithUnlimitedBudget ( PageSpace page_space)

Definition at line 1048 of file marker.cc.

1048 {
1050 "IncrementalMarkWithUnlimitedBudget");
1051
1052 SyncMarkingVisitor visitor(isolate_group_, page_space, &marking_stack_,
1053 &new_marking_stack_, &deferred_marking_stack_);
1055 visitor.DrainMarkingStack();
1056 int64_t stop = OS::GetCurrentMonotonicMicros();
1057 visitor.AddMicros(stop - start);
1058 {
1059 MonitorLocker ml(page_space->tasks_lock());
1060 visitor.FinalizeIncremental(&global_list_);
1061 marked_bytes_ += visitor.marked_bytes();
1062 marked_micros_ += visitor.marked_micros();
1063 }
1064}

◆ marked_words()

intptr_t dart::GCMarker::marked_words ( ) const
inline

Definition at line 51 of file marker.h.

51{ return marked_bytes_ >> kWordSizeLog2; }
constexpr intptr_t kWordSizeLog2
Definition globals.h:507

◆ MarkedWordsPerMicro()

intptr_t dart::GCMarker::MarkedWordsPerMicro ( ) const

Definition at line 942 of file marker.cc.

942 {
943 intptr_t marked_words_per_job_micro;
944 if (marked_micros_ == 0) {
945 marked_words_per_job_micro = marked_words(); // Prevent division by zero.
946 } else {
947 marked_words_per_job_micro = marked_words() / marked_micros_;
948 }
949 if (marked_words_per_job_micro == 0) {
950 marked_words_per_job_micro = 1; // Prevent division by zero.
951 }
952 intptr_t jobs = FLAG_marker_tasks;
953 if (jobs == 0) {
954 jobs = 1; // Marking on main thread is still one job.
955 }
956 return marked_words_per_job_micro * jobs;
957}
intptr_t marked_words() const
Definition marker.h:51

◆ MarkObjects()

void dart::GCMarker::MarkObjects ( PageSpace page_space)

Definition at line 1157 of file marker.cc.

1157 {
1158 if (isolate_group_->marking_stack() != nullptr) {
1159 isolate_group_->DisableIncrementalBarrier();
1160 }
1161
1162 Prologue();
1163 {
1164 Thread* thread = Thread::Current();
1165 const int num_tasks = FLAG_marker_tasks;
1166 if (num_tasks == 0) {
1167 TIMELINE_FUNCTION_GC_DURATION(thread, "Mark");
1169 // Mark everything on main thread.
1170 UnsyncMarkingVisitor visitor(isolate_group_, page_space, &marking_stack_,
1171 &new_marking_stack_,
1172 &deferred_marking_stack_);
1173 visitor.set_concurrent(false);
1174 ResetSlices();
1175 IterateRoots(&visitor);
1176 visitor.ProcessDeferredMarking();
1177 visitor.DrainMarkingStack();
1178 visitor.ProcessDeferredMarking();
1179 visitor.FinalizeMarking();
1180 visitor.MournWeakProperties();
1181 visitor.MournWeakReferences();
1182 visitor.MournWeakArrays();
1183 visitor.MournFinalizerEntries();
1184 IterateWeakRoots(thread);
1185 // All marking done; detach code, etc.
1186 int64_t stop = OS::GetCurrentMonotonicMicros();
1187 visitor.AddMicros(stop - start);
1188 marked_bytes_ += visitor.marked_bytes();
1189 marked_micros_ += visitor.marked_micros();
1190 } else {
1191 ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
1192
1193 ResetSlices();
1194 // Used to coordinate draining among tasks; all start out as 'busy'.
1195 RelaxedAtomic<uintptr_t> num_busy = 0;
1196 // Phase 1: Iterate over roots and drain marking stack in tasks.
1197
1198 for (intptr_t i = 0; i < num_tasks; ++i) {
1199 SyncMarkingVisitor* visitor = visitors_[i];
1200 // Visitors may or may not have already been created depending on
1201 // whether we did some concurrent marking.
1202 if (visitor == nullptr) {
1203 visitor = new SyncMarkingVisitor(isolate_group_, page_space,
1204 &marking_stack_, &new_marking_stack_,
1205 &deferred_marking_stack_);
1206 visitors_[i] = visitor;
1207 }
1208
1209 // Move all work from local blocks to the global list. Any given
1210 // visitor might not get to run if it fails to reach TryEnter soon
1211 // enough, and we must fail to visit objects but they're sitting in
1212 // such a visitor's local blocks.
1213 visitor->Flush(&global_list_);
1214 // Need to move weak property list too.
1215
1216 if (i < (num_tasks - 1)) {
1217 // Begin marking on a helper thread.
1219 this, isolate_group_, &marking_stack_, barrier, visitor,
1220 &num_busy);
1221 ASSERT(result);
1222 } else {
1223 // Last worker is the main thread.
1224 visitor->Adopt(&global_list_);
1225 ParallelMarkTask task(this, isolate_group_, &marking_stack_, barrier,
1226 visitor, &num_busy);
1227 task.RunEnteredIsolateGroup();
1228 barrier->Sync();
1229 barrier->Release();
1230 }
1231 }
1232
1233 for (intptr_t i = 0; i < num_tasks; i++) {
1234 SyncMarkingVisitor* visitor = visitors_[i];
1235 visitor->FinalizeMarking();
1236 marked_bytes_ += visitor->marked_bytes();
1237 marked_micros_ += visitor->marked_micros();
1238 delete visitor;
1239 visitors_[i] = nullptr;
1240 }
1241
1242 ASSERT(global_list_.IsEmpty());
1243 }
1244 }
1245
1246 // Separate from verify_after_gc because that verification interferes with
1247 // concurrent marking.
1248 if (FLAG_verify_after_marking) {
1249 VerifyAfterMarkingVisitor visitor;
1250 heap_->VisitObjects(&visitor);
1251 if (visitor.failed()) {
1252 FATAL("verify after marking");
1253 }
1254 }
1255
1256 Epilogue();
1257}
static ThreadPool * thread_pool()
Definition dart.h:73
friend class ParallelMarkTask
Definition marker.h:89
void Flush(GCLinkedLists *global_list)
Definition marker.cc:438
bool Run(Args &&... args)
Definition thread_pool.h:45
#define ASSERT(E)
#define FATAL(error)
GAsyncResult * result
MarkingVisitorBase< false > UnsyncMarkingVisitor
Definition marker.cc:544

◆ PruneWeak()

void dart::GCMarker::PruneWeak ( Scavenger scavenger)

Definition at line 1259 of file marker.cc.

1259 {
1260 scavenger->PruneWeak(&global_list_);
1261 for (intptr_t i = 0, n = FLAG_marker_tasks; i < n; i++) {
1262 scavenger->PruneWeak(visitors_[i]->delayed());
1263 }
1264}

◆ StartConcurrentMark()

void dart::GCMarker::StartConcurrentMark ( PageSpace page_space)

Definition at line 988 of file marker.cc.

988 {
989 isolate_group_->EnableIncrementalBarrier(&marking_stack_,
990 &deferred_marking_stack_);
991
992 const intptr_t num_tasks = FLAG_marker_tasks;
993
994 {
995 // Bulk increase task count before starting any task, instead of
996 // incrementing as each task is started, to prevent a task which
997 // races ahead from falsely believing it was the last task to complete.
998 MonitorLocker ml(page_space->tasks_lock());
999 ASSERT(page_space->phase() == PageSpace::kDone);
1000 page_space->set_phase(PageSpace::kMarking);
1001 page_space->set_tasks(page_space->tasks() + num_tasks);
1002 page_space->set_concurrent_marker_tasks(
1003 page_space->concurrent_marker_tasks() + num_tasks);
1004 page_space->set_concurrent_marker_tasks_active(
1005 page_space->concurrent_marker_tasks_active() + num_tasks);
1006 }
1007
1008 ResetSlices();
1009 for (intptr_t i = 0; i < num_tasks; i++) {
1010 ASSERT(visitors_[i] == nullptr);
1011 SyncMarkingVisitor* visitor =
1012 new SyncMarkingVisitor(isolate_group_, page_space, &marking_stack_,
1013 &new_marking_stack_, &deferred_marking_stack_);
1014 visitors_[i] = visitor;
1015
1016 if (i < (num_tasks - 1)) {
1017 // Begin marking on a helper thread.
1019 this, isolate_group_, page_space, visitor);
1020 ASSERT(result);
1021 } else {
1022 // For the last visitor, mark roots on the main thread.
1025 IterateRoots(visitor);
1026 int64_t stop = OS::GetCurrentMonotonicMicros();
1027 visitor->AddMicros(stop - start);
1028 if (FLAG_log_marker_tasks) {
1029 THR_Print("Task marked %" Pd " bytes in %" Pd64 " micros.\n",
1030 visitor->marked_bytes(), visitor->marked_micros());
1031 }
1032 // Continue non-root marking concurrently.
1034 this, isolate_group_, page_space, visitor);
1035 ASSERT(result);
1036 }
1037 }
1038
1039 isolate_group_->DeferredMarkLiveTemporaries();
1040
1041 // Wait for roots to be marked before exiting safepoint.
1042 MonitorLocker ml(&root_slices_monitor_);
1043 while (root_slices_finished_ != root_slices_count_) {
1044 ml.Wait();
1045 }
1046}
friend class ConcurrentMarkTask
Definition marker.h:88
void EnableIncrementalBarrier(MarkingStack *marking_stack, MarkingStack *deferred_marking_stack)
Definition isolate.cc:2781
void DeferredMarkLiveTemporaries()
Definition isolate.cc:2956
#define THR_Print(format,...)
Definition log.h:20
#define Pd64
Definition globals.h:416
#define Pd
Definition globals.h:408

Friends And Related Symbol Documentation

◆ ConcurrentMarkTask

friend class ConcurrentMarkTask
friend

Definition at line 88 of file marker.h.

◆ MarkingVisitorBase

template<bool sync>
friend class MarkingVisitorBase
friend

Definition at line 92 of file marker.h.

◆ ParallelMarkTask

friend class ParallelMarkTask
friend

Definition at line 89 of file marker.h.

◆ Scavenger

friend class Scavenger
friend

Definition at line 90 of file marker.h.


The documentation for this class was generated from the following files: