380 {
381#ifdef SUPPORT_TIMELINE
383#endif
384 {
386
387 while (true) {
388 intptr_t planning_task = next_planning_task_->
fetch_add(1u);
389 if (planning_task >= num_tasks_) break;
390
392 Page*
head = partitions_[planning_task].
head;
394 free_current_ =
head->object_start();
395 free_end_ =
head->object_end();
396
397 for (Page* page = head;
page !=
nullptr;
page =
page->next()) {
398 PlanPage(page);
399 }
400 }
401
403
404 if (next_setup_task_->
fetch_add(1u) == 0) {
405 compactor_->SetupLargePages();
406 }
407
409
410 while (true) {
411 intptr_t sliding_task = next_sliding_task_->
fetch_add(1u);
412 if (sliding_task >= num_tasks_) break;
413
415 Page*
head = partitions_[sliding_task].
head;
417 free_current_ =
head->object_start();
418 free_end_ =
head->object_end();
419
420 for (Page* page = head;
page !=
nullptr;
page =
page->next()) {
421 SlidePage(page);
422 }
423
424
425
426 intptr_t free_remaining = free_end_ - free_current_;
427 if (free_remaining != 0) {
428 freelist_->
Free(free_current_, free_remaining);
429 }
430
431 ASSERT(free_page_ !=
nullptr);
432 partitions_[sliding_task].
tail = free_page_;
433
434 {
436 compactor_->ForwardLargePages();
437 }
438 }
439
440
441
442
443 bool more_forwarding_tasks = true;
444 while (more_forwarding_tasks) {
445 intptr_t forwarding_task = next_forwarding_task_->
fetch_add(1u);
446 switch (forwarding_task) {
447 case 0: {
450 break;
451 }
452 case 1: {
455 break;
456 }
457 case 2: {
460 break;
461 }
462 case 3: {
465 break;
466 }
467#ifndef PRODUCT
468 case 4: {
471 [&](Isolate* isolate) {
472 ObjectIdRing* ring = isolate->object_id_ring();
473 if (ring != nullptr) {
474 ring->VisitPointers(compactor_);
475 }
476 },
477 true);
478 break;
479 }
480#endif
481 default:
482 more_forwarding_tasks = false;
483 }
484 }
485 }
486}
void VisitObjectPointers(ObjectPointerVisitor *visitor)
void Free(uword addr, intptr_t size)
void ForwardWeakTables(ObjectPointerVisitor *visitor)
StoreBuffer * store_buffer() const
void ForEachIsolate(std::function< void(Isolate *isolate)> function, bool at_safepoint=false)
void VisitWeakPersistentHandles(HandleVisitor *visitor)
T fetch_add(T arg, std::memory_order order=std::memory_order_relaxed)
void VisitObjectPointers(ObjectPointerVisitor *visitor) const
static Thread * Current()
#define TIMELINE_FUNCTION_GC_DURATION(thread, name)