Chromium Code Reviews| Index: runtime/vm/heap.cc |
| diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc |
| index ad1f24deadd339df802c63bc1e38e44f711af771..56a71f6bb1eafba32591f68fe43fa550f45f7435 100644 |
| --- a/runtime/vm/heap.cc |
| +++ b/runtime/vm/heap.cc |
| @@ -14,6 +14,7 @@ |
| #include "vm/os.h" |
| #include "vm/pages.h" |
| #include "vm/raw_object.h" |
| +#include "vm/safepoint.h" |
| #include "vm/scavenger.h" |
| #include "vm/service.h" |
| #include "vm/service_event.h" |
| @@ -192,7 +193,8 @@ void Heap::VisitObjectsImagePages(ObjectVisitor* visitor) const { |
| HeapIterationScope::HeapIterationScope(bool writable) |
| : StackResource(Thread::Current()), |
| - old_space_(isolate()->heap()->old_space()), |
| + heap_(isolate()->heap()), |
| + old_space_(heap_->old_space()), |
| writable_(writable) { |
| { |
| // It's not yet safe to iterate over a paged space while it's concurrently |
| @@ -212,16 +214,20 @@ HeapIterationScope::HeapIterationScope(bool writable) |
| old_space_->set_tasks(1); |
| } |
| + isolate()->safepoint_handler()->SafepointThreads(thread()); |
| + |
| if (writable_) { |
| - thread()->heap()->WriteProtectCode(false); |
| + heap_->WriteProtectCode(false); |
| } |
| } |
| HeapIterationScope::~HeapIterationScope() { |
| if (writable_) { |
| - thread()->heap()->WriteProtectCode(true); |
| + heap_->WriteProtectCode(true); |
| } |
| + isolate()->safepoint_handler()->ResumeThreads(thread()); |
| + |
| MonitorLocker ml(old_space_->tasks_lock()); |
| #if defined(DEBUG) |
| ASSERT(old_space_->iterating_thread_ == thread()); |
| @@ -232,21 +238,37 @@ HeapIterationScope::~HeapIterationScope() { |
| ml.NotifyAll(); |
| } |
| -void Heap::IterateObjects(ObjectVisitor* visitor) const { |
| - // The visitor must not allocate from the heap. |
| - NoSafepointScope no_safepoint_scope_; |
| - new_space_.VisitObjects(visitor); |
| - IterateOldObjects(visitor); |
| +void HeapIterationScope::IterateObjects(ObjectVisitor* visitor) const { |
| + heap_->VisitObjects(visitor); |
| } |
| -void Heap::IterateOldObjects(ObjectVisitor* visitor) const { |
| - HeapIterationScope heap_iteration_scope; |
| - old_space_.VisitObjects(visitor); |
| +void HeapIterationScope::IterateObjectsNoImagePages( |
| + ObjectVisitor* visitor) const { |
| + heap_->new_space()->VisitObjects(visitor); |
| + heap_->old_space()->VisitObjectsNoImagePages(visitor); |
|
danunez
2017/08/05 17:24:11
I would just use old_space_ since we have initiali
|
| } |
| -void Heap::IterateOldObjectsNoImagePages(ObjectVisitor* visitor) const { |
| - HeapIterationScope heap_iteration_scope; |
| - old_space_.VisitObjectsNoImagePages(visitor); |
| +void HeapIterationScope::IterateOldObjects(ObjectVisitor* visitor) const { |
| + old_space_->VisitObjects(visitor); |
| +} |
| + |
| +void HeapIterationScope::IterateOldObjectsNoImagePages( |
| + ObjectVisitor* visitor) const { |
| + old_space_->VisitObjectsNoImagePages(visitor); |
| +} |
| + |
| +void HeapIterationScope::IterateVMIsolateObjects(ObjectVisitor* visitor) const { |
| + Dart::vm_isolate()->heap()->VisitObjects(visitor); |
| +} |
| + |
| +void HeapIterationScope::IterateObjectPointers(ObjectPointerVisitor* visitor, |
| + bool validate_frames) { |
| + isolate()->VisitObjectPointers(visitor, validate_frames); |
| +} |
| + |
| +void HeapIterationScope::IterateStackPointers(ObjectPointerVisitor* visitor, |
| + bool validate_frames) { |
| + isolate()->VisitStackPointers(visitor, validate_frames); |
| } |
| void Heap::VisitObjectPointers(ObjectPointerVisitor* visitor) const { |
| @@ -263,7 +285,6 @@ RawInstructions* Heap::FindObjectInCodeSpace(FindObjectVisitor* visitor) const { |
| } |
| RawObject* Heap::FindOldObject(FindObjectVisitor* visitor) const { |
| - HeapIterationScope heap_iteration_scope; |
| return old_space_.FindObject(visitor, HeapPage::kData); |
| } |