| Index: runtime/vm/heap.cc
|
| diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
|
| index ad1f24deadd339df802c63bc1e38e44f711af771..7cdbf210ae2a50e27149b688ce83e2ad31dbf145 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"
|
| @@ -190,9 +191,10 @@ void Heap::VisitObjectsImagePages(ObjectVisitor* visitor) const {
|
| old_space_.VisitObjectsImagePages(visitor);
|
| }
|
|
|
| -HeapIterationScope::HeapIterationScope(bool writable)
|
| - : StackResource(Thread::Current()),
|
| - old_space_(isolate()->heap()->old_space()),
|
| +HeapIterationScope::HeapIterationScope(Thread* thread, bool writable)
|
| + : StackResource(thread),
|
| + 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
|
| @@ -200,28 +202,32 @@ HeapIterationScope::HeapIterationScope(bool writable)
|
| MonitorLocker ml(old_space_->tasks_lock());
|
| #if defined(DEBUG)
|
| // We currently don't support nesting of HeapIterationScopes.
|
| - ASSERT(old_space_->iterating_thread_ != thread());
|
| + ASSERT(old_space_->iterating_thread_ != thread);
|
| #endif
|
| while (old_space_->tasks() > 0) {
|
| - ml.WaitWithSafepointCheck(thread());
|
| + ml.WaitWithSafepointCheck(thread);
|
| }
|
| #if defined(DEBUG)
|
| ASSERT(old_space_->iterating_thread_ == NULL);
|
| - old_space_->iterating_thread_ = thread();
|
| + old_space_->iterating_thread_ = thread;
|
| #endif
|
| 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);
|
| }
|
|
|
| -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);
|
| }
|
|
|
| @@ -547,7 +568,7 @@ ObjectSet* Heap::CreateAllocatedObjectSet(
|
| }
|
|
|
| bool Heap::Verify(MarkExpectation mark_expectation) const {
|
| - HeapIterationScope heap_iteration_scope;
|
| + HeapIterationScope heap_iteration_scope(Thread::Current());
|
| return VerifyGC(mark_expectation);
|
| }
|
|
|
|
|