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

Public Member Functions

 ParallelScavengerTask (IsolateGroup *isolate_group, ThreadBarrier *barrier, ParallelScavengerVisitor *visitor, RelaxedAtomic< uintptr_t > *num_busy)
 
virtual 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 621 of file scavenger.cc.

Constructor & Destructor Documentation

◆ ParallelScavengerTask()

dart::ParallelScavengerTask::ParallelScavengerTask ( IsolateGroup isolate_group,
ThreadBarrier barrier,
ParallelScavengerVisitor visitor,
RelaxedAtomic< uintptr_t > *  num_busy 
)
inline

Definition at line 623 of file scavenger.cc.

627 : isolate_group_(isolate_group),
628 barrier_(barrier),
629 visitor_(visitor),
630 num_busy_(num_busy) {}

Member Function Documentation

◆ Run()

virtual void dart::ParallelScavengerTask::Run ( )
inlinevirtual

Implements dart::ThreadPool::Task.

Definition at line 632 of file scavenger.cc.

632 {
633 if (!barrier_->TryEnter()) {
634 barrier_->Release();
635 return;
636 }
637
639 isolate_group_, Thread::kScavengerTask, /*bypass_safepoint=*/true);
640 ASSERT(result);
641
643
644 Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
645
646 barrier_->Sync();
647 barrier_->Release();
648 }
@ kScavengerTask
Definition thread.h:352
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::ParallelScavengerTask::RunEnteredIsolateGroup ( )
inline

Definition at line 650 of file scavenger.cc.

650 {
651 TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ParallelScavenge");
652
653 num_busy_->fetch_add(1u);
654 visitor_->ProcessRoots();
655
656 // Phase 1: Copying.
657 bool more_to_scavenge = false;
658 do {
659 do {
660 visitor_->ProcessSurvivors();
661 } while (visitor_->WaitForWork(num_busy_));
662 // Wait for all scavengers to stop.
663 barrier_->Sync();
664#if defined(DEBUG)
665 ASSERT(num_busy_->load() == 0);
666 // Caveat: must not allow any marker to continue past the barrier
667 // before we checked num_busy, otherwise one of them might rush
668 // ahead and increment it.
669 barrier_->Sync();
670#endif
671 // Check if we have any pending properties with marked keys.
672 // Those might have been marked by another marker.
673 visitor_->ProcessWeakProperties();
674 more_to_scavenge = visitor_->HasWork();
675 if (more_to_scavenge) {
676 // We have more work to do. Notify others.
677 num_busy_->fetch_add(1u);
678 }
679
680 // Wait for all other scavengers to finish processing their pending
681 // weak properties and decide if they need to continue marking.
682 // Caveat: we need two barriers here to make this decision in lock step
683 // between all scavengers and the main thread.
684 barrier_->Sync();
685 if (!more_to_scavenge && (num_busy_->load() > 0)) {
686 // All scavengers continue to mark as long as any single marker has
687 // some work to do.
688 num_busy_->fetch_add(1u);
689 more_to_scavenge = true;
690 }
691 barrier_->Sync();
692 } while (more_to_scavenge);
693
694 ASSERT(!visitor_->HasWork());
695
696 // Phase 2: Weak processing, statistics.
697 visitor_->ProcessWeak();
698 }
T load(std::memory_order order=std::memory_order_relaxed) const
Definition atomic.h:21
T fetch_add(T arg, std::memory_order order=std::memory_order_relaxed)
Definition atomic.h:35
bool WaitForWork(RelaxedAtomic< uintptr_t > *num_busy)
Definition scavenger.cc:309
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: