1157 {
1160 }
1161
1162 Prologue();
1163 {
1165 const int num_tasks = FLAG_marker_tasks;
1166 if (num_tasks == 0) {
1169
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
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
1195 RelaxedAtomic<uintptr_t> num_busy = 0;
1196
1197
1198 for (intptr_t i = 0; i < num_tasks; ++i) {
1200
1201
1202 if (visitor == nullptr) {
1204 &marking_stack_, &new_marking_stack_,
1205 &deferred_marking_stack_);
1206 visitors_[i] = visitor;
1207 }
1208
1209
1210
1211
1212
1213 visitor->
Flush(&global_list_);
1214
1215
1216 if (i < (num_tasks - 1)) {
1217
1219 this, isolate_group_, &marking_stack_, barrier, visitor,
1220 &num_busy);
1222 } else {
1223
1224 visitor->Adopt(&global_list_);
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++) {
1236 marked_bytes_ += visitor->marked_bytes();
1237 marked_micros_ += visitor->marked_micros();
1238 delete visitor;
1239 visitors_[i] = nullptr;
1240 }
1241
1243 }
1244 }
1245
1246
1247
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()
friend class ParallelMarkTask
void Flush(GCLinkedLists *global_list)
bool Run(Args &&... args)
MarkingVisitorBase< false > UnsyncMarkingVisitor