Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | List of all members
dart::CompactorTask Class Reference
Inheritance diagram for dart::CompactorTask:
dart::ThreadPool::Task dart::IntrusiveDListEntry< Task >

Public Member Functions

 CompactorTask (IsolateGroup *isolate_group, GCCompactor *compactor, ThreadBarrier *barrier, RelaxedAtomic< intptr_t > *next_planning_task, RelaxedAtomic< intptr_t > *next_setup_task, RelaxedAtomic< intptr_t > *next_sliding_task, RelaxedAtomic< intptr_t > *next_forwarding_task, intptr_t num_tasks, Partition *partitions, FreeList *freelist)
 
void Run ()
 
void RunEnteredIsolateGroup ()
 
- Public Member Functions inherited from dart::ThreadPool::Task
virtual ~Task ()
 
- Public Member Functions inherited from dart::IntrusiveDListEntry< Task >
 IntrusiveDListEntry ()
 
 ~IntrusiveDListEntry ()
 

Additional Inherited Members

- Protected Member Functions inherited from dart::ThreadPool::Task
 Task ()
 

Detailed Description

Definition at line 125 of file compactor.cc.

Constructor & Destructor Documentation

◆ CompactorTask()

dart::CompactorTask::CompactorTask ( IsolateGroup isolate_group,
GCCompactor compactor,
ThreadBarrier barrier,
RelaxedAtomic< intptr_t > *  next_planning_task,
RelaxedAtomic< intptr_t > *  next_setup_task,
RelaxedAtomic< intptr_t > *  next_sliding_task,
RelaxedAtomic< intptr_t > *  next_forwarding_task,
intptr_t  num_tasks,
Partition partitions,
FreeList freelist 
)
inline

Definition at line 127 of file compactor.cc.

137 : isolate_group_(isolate_group),
138 compactor_(compactor),
139 barrier_(barrier),
140 next_planning_task_(next_planning_task),
141 next_setup_task_(next_setup_task),
142 next_sliding_task_(next_sliding_task),
143 next_forwarding_task_(next_forwarding_task),
144 num_tasks_(num_tasks),
145 partitions_(partitions),
146 freelist_(freelist),
147 free_page_(nullptr),
148 free_current_(0),
149 free_end_(0) {}

Member Function Documentation

◆ Run()

void dart::CompactorTask::Run ( )
virtual

Implements dart::ThreadPool::Task.

Definition at line 360 of file compactor.cc.

360 {
361 if (!barrier_->TryEnter()) {
362 barrier_->Release();
363 return;
364 }
365
366 bool result =
368 /*bypass_safepoint=*/true);
369 ASSERT(result);
370
372
373 Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
374
375 // This task is done. Notify the original thread.
376 barrier_->Sync();
377 barrier_->Release();
378}
void RunEnteredIsolateGroup()
Definition compactor.cc:380
@ kCompactorTask
Definition thread.h:351
static void ExitIsolateGroupAsHelper(bool bypass_safepoint)
Definition thread.cc:494
static bool EnterIsolateGroupAsHelper(IsolateGroup *isolate_group, TaskKind kind, bool bypass_safepoint)
Definition thread.cc:476
#define ASSERT(E)
GAsyncResult * result

◆ RunEnteredIsolateGroup()

void dart::CompactorTask::RunEnteredIsolateGroup ( )

Definition at line 380 of file compactor.cc.

380 {
381#ifdef SUPPORT_TIMELINE
382 Thread* thread = Thread::Current();
383#endif
384 {
385 isolate_group_->heap()->old_space()->SweepLarge();
386
387 while (true) {
388 intptr_t planning_task = next_planning_task_->fetch_add(1u);
389 if (planning_task >= num_tasks_) break;
390
391 TIMELINE_FUNCTION_GC_DURATION(thread, "Plan");
392 Page* head = partitions_[planning_task].head;
393 free_page_ = 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
402 barrier_->Sync();
403
404 if (next_setup_task_->fetch_add(1u) == 0) {
405 compactor_->SetupLargePages();
406 }
407
408 barrier_->Sync();
409
410 while (true) {
411 intptr_t sliding_task = next_sliding_task_->fetch_add(1u);
412 if (sliding_task >= num_tasks_) break;
413
414 TIMELINE_FUNCTION_GC_DURATION(thread, "Slide");
415 Page* head = partitions_[sliding_task].head;
416 free_page_ = 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 // Add any leftover in the last used page to the freelist. This is
425 // required to make the page walkable during forwarding, etc.
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_; // Last live page.
433
434 {
435 TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardLargePages");
436 compactor_->ForwardLargePages();
437 }
438 }
439
440 // Heap: Regular pages already visited during sliding. Code and image pages
441 // have no pointers to forward. Visit large pages and new-space.
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: {
448 TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardNewSpace");
449 isolate_group_->heap()->new_space()->VisitObjectPointers(compactor_);
450 break;
451 }
452 case 1: {
453 TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardRememberedSet");
454 isolate_group_->store_buffer()->VisitObjectPointers(compactor_);
455 break;
456 }
457 case 2: {
458 TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardWeakTables");
459 isolate_group_->heap()->ForwardWeakTables(compactor_);
460 break;
461 }
462 case 3: {
463 TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardWeakHandles");
464 isolate_group_->VisitWeakPersistentHandles(compactor_);
465 break;
466 }
467#ifndef PRODUCT
468 case 4: {
469 TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardObjectIdRing");
470 isolate_group_->ForEachIsolate(
471 [&](Isolate* isolate) {
472 ObjectIdRing* ring = isolate->object_id_ring();
473 if (ring != nullptr) {
474 ring->VisitPointers(compactor_);
475 }
476 },
477 /*at_safepoint=*/true);
478 break;
479 }
480#endif // !PRODUCT
481 default:
482 more_forwarding_tasks = false;
483 }
484 }
485 }
486}
void VisitObjectPointers(ObjectPointerVisitor *visitor)
void Free(uword addr, intptr_t size)
Definition freelist.cc:193
Scavenger * new_space()
Definition heap.h:62
PageSpace * old_space()
Definition heap.h:63
void ForwardWeakTables(ObjectPointerVisitor *visitor)
Definition heap.cc:954
StoreBuffer * store_buffer() const
Definition isolate.h:504
void ForEachIsolate(std::function< void(Isolate *isolate)> function, bool at_safepoint=false)
Definition isolate.cc:2798
Heap * heap() const
Definition isolate.h:295
void VisitWeakPersistentHandles(HandleVisitor *visitor)
Definition isolate.cc:2952
T fetch_add(T arg, std::memory_order order=std::memory_order_relaxed)
Definition atomic.h:35
void VisitObjectPointers(ObjectPointerVisitor *visitor) const
static Thread * Current()
Definition thread.h:361
#define TIMELINE_FUNCTION_GC_DURATION(thread, name)
Definition timeline.h:41

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