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

#include <heap.h>

Inheritance diagram for dart::HeapIterationScope:
dart::ThreadStackResource dart::StackResource

Public Member Functions

 HeapIterationScope (Thread *thread, bool writable=false)
 
 ~HeapIterationScope ()
 
void IterateObjects (ObjectVisitor *visitor) const
 
void IterateObjectsNoImagePages (ObjectVisitor *visitor) const
 
void IterateOldObjects (ObjectVisitor *visitor) const
 
void IterateOldObjectsNoImagePages (ObjectVisitor *visitor) const
 
void IterateVMIsolateObjects (ObjectVisitor *visitor) const
 
void IterateObjectPointers (ObjectPointerVisitor *visitor, ValidationPolicy validate_frames)
 
void IterateStackPointers (ObjectPointerVisitor *visitor, ValidationPolicy validate_frames)
 
- Public Member Functions inherited from dart::ThreadStackResource
 ThreadStackResource (Thread *T)
 
 ~ThreadStackResource ()
 
Threadthread () const
 
Isolateisolate () const
 
IsolateGroupisolate_group () const
 
- Public Member Functions inherited from dart::StackResource
 StackResource (ThreadState *thread)
 
virtual ~StackResource ()
 
ThreadStatethread () const
 

Additional Inherited Members

- Static Public Member Functions inherited from dart::StackResource
static void Unwind (ThreadState *thread)
 
static void UnwindAbove (ThreadState *thread, StackResource *new_top)
 

Detailed Description

Definition at line 394 of file heap.h.

Constructor & Destructor Documentation

◆ HeapIterationScope()

dart::HeapIterationScope::HeapIterationScope ( Thread thread,
bool  writable = false 
)
explicit

Definition at line 272 of file heap.cc.

274 heap_(isolate_group()->heap()),
275 old_space_(heap_->old_space()),
276 writable_(writable) {
277 isolate_group()->safepoint_handler()->SafepointThreads(thread,
279
280 {
281 // It's not safe to iterate over old space when concurrent marking or
282 // sweeping is in progress, or another thread is iterating the heap, so wait
283 // for any such task to complete first.
284 MonitorLocker ml(old_space_->tasks_lock());
285#if defined(DEBUG)
286 // We currently don't support nesting of HeapIterationScopes.
287 ASSERT(old_space_->iterating_thread_ != thread);
288#endif
289 while ((old_space_->tasks() > 0) ||
290 (old_space_->phase() != PageSpace::kDone)) {
291 old_space_->AssistTasks(&ml);
292 if (old_space_->phase() == PageSpace::kAwaitingFinalization) {
293 ml.Exit();
294 heap_->CollectOldSpaceGarbage(thread, GCType::kMarkSweep,
296 ml.Enter();
297 }
298 while (old_space_->tasks() > 0) {
299 ml.Wait();
300 }
301 }
302#if defined(DEBUG)
303 ASSERT(old_space_->iterating_thread_ == nullptr);
304 old_space_->iterating_thread_ = thread;
305#endif
306 old_space_->set_tasks(1);
307 }
308
309 if (writable_) {
310 heap_->WriteProtectCode(false);
311 }
312}
PageSpace * old_space()
Definition heap.h:63
void WriteProtectCode(bool read_only)
Definition heap.h:127
SafepointHandler * safepoint_handler()
Definition isolate.h:333
intptr_t tasks() const
Definition pages.h:310
void set_tasks(intptr_t val)
Definition pages.h:311
@ kAwaitingFinalization
Definition pages.h:133
void AssistTasks(MonitorLocker *ml)
Definition pages.cc:904
Monitor * tasks_lock() const
Definition pages.h:309
Phase phase() const
Definition pages.h:336
IsolateGroup * isolate_group() const
#define ASSERT(E)
@ kGC
Definition thread.h:291

◆ ~HeapIterationScope()

dart::HeapIterationScope::~HeapIterationScope ( )

Definition at line 314 of file heap.cc.

314 {
315 if (writable_) {
316 heap_->WriteProtectCode(true);
317 }
318
319 {
320 MonitorLocker ml(old_space_->tasks_lock());
321#if defined(DEBUG)
322 ASSERT(old_space_->iterating_thread_ == thread());
323 old_space_->iterating_thread_ = nullptr;
324#endif
325 ASSERT(old_space_->tasks() == 1);
326 old_space_->set_tasks(0);
327 ml.NotifyAll();
328 }
329
330 isolate_group()->safepoint_handler()->ResumeThreads(thread(),
332}

Member Function Documentation

◆ IterateObjectPointers()

void dart::HeapIterationScope::IterateObjectPointers ( ObjectPointerVisitor visitor,
ValidationPolicy  validate_frames 
)

Definition at line 357 of file heap.cc.

359 {
360 isolate_group()->VisitObjectPointers(visitor, validate_frames);
361}
void VisitObjectPointers(ObjectPointerVisitor *visitor, ValidationPolicy validate_frames)
Definition isolate.cc:2868

◆ IterateObjects()

void dart::HeapIterationScope::IterateObjects ( ObjectVisitor visitor) const

Definition at line 334 of file heap.cc.

334 {
335 heap_->VisitObjects(visitor);
336}

◆ IterateObjectsNoImagePages()

void dart::HeapIterationScope::IterateObjectsNoImagePages ( ObjectVisitor visitor) const

Definition at line 338 of file heap.cc.

339 {
340 heap_->new_space()->VisitObjects(visitor);
341 heap_->old_space()->VisitObjectsNoImagePages(visitor);
342}
Scavenger * new_space()
Definition heap.h:62
void VisitObjectsNoImagePages(ObjectVisitor *visitor) const
Definition pages.cc:651
void VisitObjects(ObjectVisitor *visitor) const

◆ IterateOldObjects()

void dart::HeapIterationScope::IterateOldObjects ( ObjectVisitor visitor) const

Definition at line 344 of file heap.cc.

344 {
345 old_space_->VisitObjects(visitor);
346}
void VisitObjects(ObjectVisitor *visitor) const
Definition pages.cc:645

◆ IterateOldObjectsNoImagePages()

void dart::HeapIterationScope::IterateOldObjectsNoImagePages ( ObjectVisitor visitor) const

Definition at line 348 of file heap.cc.

349 {
350 old_space_->VisitObjectsNoImagePages(visitor);
351}

◆ IterateStackPointers()

void dart::HeapIterationScope::IterateStackPointers ( ObjectPointerVisitor visitor,
ValidationPolicy  validate_frames 
)

Definition at line 363 of file heap.cc.

365 {
366 isolate_group()->VisitStackPointers(visitor, validate_frames);
367}
void VisitStackPointers(ObjectPointerVisitor *visitor, ValidationPolicy validate_frames)
Definition isolate.cc:2924

◆ IterateVMIsolateObjects()

void dart::HeapIterationScope::IterateVMIsolateObjects ( ObjectVisitor visitor) const

Definition at line 353 of file heap.cc.

353 {
354 Dart::vm_isolate_group()->heap()->VisitObjects(visitor);
355}
static IsolateGroup * vm_isolate_group()
Definition dart.h:69
Heap * heap() const
Definition isolate.h:295

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