| Index: runtime/vm/heap.cc
|
| diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
|
| index f73af75a691500ace737cf7f002409c86a3f3011..9d741133bed6c7389dc7f13d93589601162f4115 100644
|
| --- a/runtime/vm/heap.cc
|
| +++ b/runtime/vm/heap.cc
|
| @@ -47,7 +47,6 @@ Heap::Heap(Isolate* isolate,
|
| stats_.num_ = 0;
|
| }
|
|
|
| -
|
| Heap::~Heap() {
|
| delete barrier_;
|
| delete barrier_done_;
|
| @@ -58,7 +57,6 @@ Heap::~Heap() {
|
| }
|
| }
|
|
|
| -
|
| uword Heap::AllocateNew(intptr_t size) {
|
| ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
|
| // Currently, only the Dart thread may allocate in new space.
|
| @@ -77,7 +75,6 @@ uword Heap::AllocateNew(intptr_t size) {
|
| return addr;
|
| }
|
|
|
| -
|
| uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
|
| ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
|
| uword addr = old_space_.TryAllocate(size, type);
|
| @@ -125,7 +122,6 @@ uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
|
| return 0;
|
| }
|
|
|
| -
|
| void Heap::AllocateExternal(intptr_t size, Space space) {
|
| ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
|
| if (space == kNew) {
|
| @@ -163,44 +159,36 @@ bool Heap::Contains(uword addr) const {
|
| return new_space_.Contains(addr) || old_space_.Contains(addr);
|
| }
|
|
|
| -
|
| bool Heap::NewContains(uword addr) const {
|
| return new_space_.Contains(addr);
|
| }
|
|
|
| -
|
| bool Heap::OldContains(uword addr) const {
|
| return old_space_.Contains(addr);
|
| }
|
|
|
| -
|
| bool Heap::CodeContains(uword addr) const {
|
| return old_space_.Contains(addr, HeapPage::kExecutable);
|
| }
|
|
|
| -
|
| bool Heap::DataContains(uword addr) const {
|
| return old_space_.DataContains(addr);
|
| }
|
|
|
| -
|
| void Heap::VisitObjects(ObjectVisitor* visitor) const {
|
| new_space_.VisitObjects(visitor);
|
| old_space_.VisitObjects(visitor);
|
| }
|
|
|
| -
|
| void Heap::VisitObjectsNoImagePages(ObjectVisitor* visitor) const {
|
| new_space_.VisitObjects(visitor);
|
| old_space_.VisitObjectsNoImagePages(visitor);
|
| }
|
|
|
| -
|
| void Heap::VisitObjectsImagePages(ObjectVisitor* visitor) const {
|
| old_space_.VisitObjectsImagePages(visitor);
|
| }
|
|
|
| -
|
| HeapIterationScope::HeapIterationScope(bool writable)
|
| : StackResource(Thread::Current()),
|
| old_space_(isolate()->heap()->old_space()),
|
| @@ -228,7 +216,6 @@ HeapIterationScope::HeapIterationScope(bool writable)
|
| }
|
| }
|
|
|
| -
|
| HeapIterationScope::~HeapIterationScope() {
|
| if (writable_) {
|
| thread()->heap()->WriteProtectCode(true);
|
| @@ -244,7 +231,6 @@ HeapIterationScope::~HeapIterationScope() {
|
| ml.NotifyAll();
|
| }
|
|
|
| -
|
| void Heap::IterateObjects(ObjectVisitor* visitor) const {
|
| // The visitor must not allocate from the heap.
|
| NoSafepointScope no_safepoint_scope_;
|
| @@ -252,25 +238,21 @@ void Heap::IterateObjects(ObjectVisitor* visitor) const {
|
| IterateOldObjects(visitor);
|
| }
|
|
|
| -
|
| void Heap::IterateOldObjects(ObjectVisitor* visitor) const {
|
| HeapIterationScope heap_iteration_scope;
|
| old_space_.VisitObjects(visitor);
|
| }
|
|
|
| -
|
| void Heap::IterateOldObjectsNoImagePages(ObjectVisitor* visitor) const {
|
| HeapIterationScope heap_iteration_scope;
|
| old_space_.VisitObjectsNoImagePages(visitor);
|
| }
|
|
|
| -
|
| void Heap::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
|
| new_space_.VisitObjectPointers(visitor);
|
| old_space_.VisitObjectPointers(visitor);
|
| }
|
|
|
| -
|
| RawInstructions* Heap::FindObjectInCodeSpace(FindObjectVisitor* visitor) const {
|
| // Only executable pages can have RawInstructions objects.
|
| RawObject* raw_obj = old_space_.FindObject(visitor, HeapPage::kExecutable);
|
| @@ -279,18 +261,15 @@ RawInstructions* Heap::FindObjectInCodeSpace(FindObjectVisitor* visitor) const {
|
| return reinterpret_cast<RawInstructions*>(raw_obj);
|
| }
|
|
|
| -
|
| RawObject* Heap::FindOldObject(FindObjectVisitor* visitor) const {
|
| HeapIterationScope heap_iteration_scope;
|
| return old_space_.FindObject(visitor, HeapPage::kData);
|
| }
|
|
|
| -
|
| RawObject* Heap::FindNewObject(FindObjectVisitor* visitor) const {
|
| return new_space_.FindObject(visitor);
|
| }
|
|
|
| -
|
| RawObject* Heap::FindObject(FindObjectVisitor* visitor) const {
|
| // The visitor must not allocate from the heap.
|
| NoSafepointScope no_safepoint_scope;
|
| @@ -306,7 +285,6 @@ RawObject* Heap::FindObject(FindObjectVisitor* visitor) const {
|
| return raw_obj;
|
| }
|
|
|
| -
|
| bool Heap::BeginNewSpaceGC(Thread* thread) {
|
| MonitorLocker ml(&gc_in_progress_monitor_);
|
| bool start_gc_on_thread = true;
|
| @@ -321,7 +299,6 @@ bool Heap::BeginNewSpaceGC(Thread* thread) {
|
| return false;
|
| }
|
|
|
| -
|
| void Heap::EndNewSpaceGC() {
|
| MonitorLocker ml(&gc_in_progress_monitor_);
|
| ASSERT(gc_new_space_in_progress_);
|
| @@ -329,7 +306,6 @@ void Heap::EndNewSpaceGC() {
|
| ml.NotifyAll();
|
| }
|
|
|
| -
|
| bool Heap::BeginOldSpaceGC(Thread* thread) {
|
| MonitorLocker ml(&gc_in_progress_monitor_);
|
| bool start_gc_on_thread = true;
|
| @@ -344,7 +320,6 @@ bool Heap::BeginOldSpaceGC(Thread* thread) {
|
| return false;
|
| }
|
|
|
| -
|
| void Heap::EndOldSpaceGC() {
|
| MonitorLocker ml(&gc_in_progress_monitor_);
|
| ASSERT(gc_old_space_in_progress_);
|
| @@ -352,7 +327,6 @@ void Heap::EndOldSpaceGC() {
|
| ml.NotifyAll();
|
| }
|
|
|
| -
|
| #ifndef PRODUCT
|
| void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) {
|
| ClassTable* class_table = isolate()->class_table();
|
| @@ -364,7 +338,6 @@ void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) {
|
| }
|
| #endif
|
|
|
| -
|
| void Heap::EvacuateNewSpace(Thread* thread, GCReason reason) {
|
| ASSERT(reason == kFull);
|
| if (BeginNewSpaceGC(thread)) {
|
| @@ -381,7 +354,6 @@ void Heap::EvacuateNewSpace(Thread* thread, GCReason reason) {
|
| }
|
| }
|
|
|
| -
|
| void Heap::CollectNewSpaceGarbage(Thread* thread,
|
| ApiCallbacks api_callbacks,
|
| GCReason reason) {
|
| @@ -405,7 +377,6 @@ void Heap::CollectNewSpaceGarbage(Thread* thread,
|
| }
|
| }
|
|
|
| -
|
| void Heap::CollectOldSpaceGarbage(Thread* thread,
|
| ApiCallbacks api_callbacks,
|
| GCReason reason) {
|
| @@ -427,7 +398,6 @@ void Heap::CollectOldSpaceGarbage(Thread* thread,
|
| }
|
| }
|
|
|
| -
|
| void Heap::CollectGarbage(Space space,
|
| ApiCallbacks api_callbacks,
|
| GCReason reason) {
|
| @@ -447,7 +417,6 @@ void Heap::CollectGarbage(Space space,
|
| }
|
| }
|
|
|
| -
|
| void Heap::CollectGarbage(Space space) {
|
| Thread* thread = Thread::Current();
|
| if (space == kOld) {
|
| @@ -458,7 +427,6 @@ void Heap::CollectGarbage(Space space) {
|
| }
|
| }
|
|
|
| -
|
| void Heap::CollectAllGarbage() {
|
| Thread* thread = Thread::Current();
|
|
|
| @@ -468,7 +436,6 @@ void Heap::CollectAllGarbage() {
|
| CollectOldSpaceGarbage(thread, kInvokeApiCallbacks, kFull);
|
| }
|
|
|
| -
|
| void Heap::WaitForSweeperTasks(Thread* thread) {
|
| MonitorLocker ml(old_space_.tasks_lock());
|
| while (old_space_.tasks() > 0) {
|
| @@ -476,7 +443,6 @@ void Heap::WaitForSweeperTasks(Thread* thread) {
|
| }
|
| }
|
|
|
| -
|
| void Heap::UpdateGlobalMaxUsed() {
|
| ASSERT(isolate_ != NULL);
|
| // We are accessing the used in words count for both new and old space
|
| @@ -486,29 +452,24 @@ void Heap::UpdateGlobalMaxUsed() {
|
| (UsedInWords(Heap::kOld) * kWordSize));
|
| }
|
|
|
| -
|
| void Heap::InitGrowthControl() {
|
| old_space_.InitGrowthControl();
|
| }
|
|
|
| -
|
| void Heap::SetGrowthControlState(bool state) {
|
| old_space_.SetGrowthControlState(state);
|
| }
|
|
|
| -
|
| bool Heap::GrowthControlState() {
|
| return old_space_.GrowthControlState();
|
| }
|
|
|
| -
|
| void Heap::WriteProtect(bool read_only) {
|
| read_only_ = read_only;
|
| new_space_.WriteProtect(read_only);
|
| old_space_.WriteProtect(read_only);
|
| }
|
|
|
| -
|
| intptr_t Heap::TopOffset(Heap::Space space) {
|
| if (space == kNew) {
|
| return OFFSET_OF(Heap, new_space_) + Scavenger::top_offset();
|
| @@ -518,7 +479,6 @@ intptr_t Heap::TopOffset(Heap::Space space) {
|
| }
|
| }
|
|
|
| -
|
| intptr_t Heap::EndOffset(Heap::Space space) {
|
| if (space == kNew) {
|
| return OFFSET_OF(Heap, new_space_) + Scavenger::end_offset();
|
| @@ -528,7 +488,6 @@ intptr_t Heap::EndOffset(Heap::Space space) {
|
| }
|
| }
|
|
|
| -
|
| void Heap::Init(Isolate* isolate,
|
| intptr_t max_new_gen_words,
|
| intptr_t max_old_gen_words,
|
| @@ -539,7 +498,6 @@ void Heap::Init(Isolate* isolate,
|
| isolate->set_heap(heap);
|
| }
|
|
|
| -
|
| void Heap::RegionName(Heap* heap, Space space, char* name, intptr_t name_size) {
|
| const bool no_isolate_name = (heap == NULL) || (heap->isolate() == NULL) ||
|
| (heap->isolate()->debugger_name() == NULL);
|
| @@ -562,13 +520,11 @@ void Heap::RegionName(Heap* heap, Space space, char* name, intptr_t name_size) {
|
| OS::SNPrint(name, name_size, "dart-%s %s", space_name, isolate_name);
|
| }
|
|
|
| -
|
| void Heap::AddRegionsToObjectSet(ObjectSet* set) const {
|
| new_space_.AddRegionsToObjectSet(set);
|
| old_space_.AddRegionsToObjectSet(set);
|
| }
|
|
|
| -
|
| ObjectSet* Heap::CreateAllocatedObjectSet(
|
| Zone* zone,
|
| MarkExpectation mark_expectation) const {
|
| @@ -598,13 +554,11 @@ ObjectSet* Heap::CreateAllocatedObjectSet(
|
| return allocated_set;
|
| }
|
|
|
| -
|
| bool Heap::Verify(MarkExpectation mark_expectation) const {
|
| HeapIterationScope heap_iteration_scope;
|
| return VerifyGC(mark_expectation);
|
| }
|
|
|
| -
|
| bool Heap::VerifyGC(MarkExpectation mark_expectation) const {
|
| StackZone stack_zone(Thread::Current());
|
| ObjectSet* allocated_set =
|
| @@ -616,7 +570,6 @@ bool Heap::VerifyGC(MarkExpectation mark_expectation) const {
|
| return true;
|
| }
|
|
|
| -
|
| void Heap::PrintSizes() const {
|
| OS::PrintErr(
|
| "New space (%" Pd64 "k of %" Pd64
|
| @@ -626,24 +579,20 @@ void Heap::PrintSizes() const {
|
| (UsedInWords(kOld) / KBInWords), (CapacityInWords(kOld) / KBInWords));
|
| }
|
|
|
| -
|
| int64_t Heap::UsedInWords(Space space) const {
|
| return space == kNew ? new_space_.UsedInWords() : old_space_.UsedInWords();
|
| }
|
|
|
| -
|
| int64_t Heap::CapacityInWords(Space space) const {
|
| return space == kNew ? new_space_.CapacityInWords()
|
| : old_space_.CapacityInWords();
|
| }
|
|
|
| -
|
| int64_t Heap::ExternalInWords(Space space) const {
|
| return space == kNew ? new_space_.ExternalInWords()
|
| : old_space_.ExternalInWords();
|
| }
|
|
|
| -
|
| int64_t Heap::GCTimeInMicros(Space space) const {
|
| if (space == kNew) {
|
| return new_space_.gc_time_micros();
|
| @@ -651,7 +600,6 @@ int64_t Heap::GCTimeInMicros(Space space) const {
|
| return old_space_.gc_time_micros();
|
| }
|
|
|
| -
|
| intptr_t Heap::Collections(Space space) const {
|
| if (space == kNew) {
|
| return new_space_.collections();
|
| @@ -659,7 +607,6 @@ intptr_t Heap::Collections(Space space) const {
|
| return old_space_.collections();
|
| }
|
|
|
| -
|
| const char* Heap::GCReasonToString(GCReason gc_reason) {
|
| switch (gc_reason) {
|
| case kNewSpace:
|
| @@ -680,7 +627,6 @@ const char* Heap::GCReasonToString(GCReason gc_reason) {
|
| }
|
| }
|
|
|
| -
|
| int64_t Heap::PeerCount() const {
|
| return new_weak_tables_[kPeers]->count() + old_weak_tables_[kPeers]->count();
|
| }
|
| @@ -692,19 +638,16 @@ int64_t Heap::HashCount() const {
|
| }
|
| #endif
|
|
|
| -
|
| int64_t Heap::ObjectIdCount() const {
|
| return new_weak_tables_[kObjectIds]->count() +
|
| old_weak_tables_[kObjectIds]->count();
|
| }
|
|
|
| -
|
| void Heap::ResetObjectIdTable() {
|
| new_weak_tables_[kObjectIds]->Reset();
|
| old_weak_tables_[kObjectIds]->Reset();
|
| }
|
|
|
| -
|
| intptr_t Heap::GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const {
|
| if (raw_obj->IsNewObject()) {
|
| return new_weak_tables_[sel]->GetValue(raw_obj);
|
| @@ -713,7 +656,6 @@ intptr_t Heap::GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const {
|
| return old_weak_tables_[sel]->GetValue(raw_obj);
|
| }
|
|
|
| -
|
| void Heap::SetWeakEntry(RawObject* raw_obj, WeakSelector sel, intptr_t val) {
|
| if (raw_obj->IsNewObject()) {
|
| new_weak_tables_[sel]->SetValue(raw_obj, val);
|
| @@ -723,7 +665,6 @@ void Heap::SetWeakEntry(RawObject* raw_obj, WeakSelector sel, intptr_t val) {
|
| }
|
| }
|
|
|
| -
|
| #ifndef PRODUCT
|
| void Heap::PrintToJSONObject(Space space, JSONObject* object) const {
|
| if (space == kNew) {
|
| @@ -734,7 +675,6 @@ void Heap::PrintToJSONObject(Space space, JSONObject* object) const {
|
| }
|
| #endif // PRODUCT
|
|
|
| -
|
| void Heap::RecordBeforeGC(Space space, GCReason reason) {
|
| ASSERT((space == kNew && gc_new_space_in_progress_) ||
|
| (space == kOld && gc_old_space_in_progress_));
|
| @@ -750,7 +690,6 @@ void Heap::RecordBeforeGC(Space space, GCReason reason) {
|
| stats_.data_[i] = 0;
|
| }
|
|
|
| -
|
| void Heap::RecordAfterGC(Space space) {
|
| stats_.after_.micros_ = OS::GetCurrentMonotonicMicros();
|
| int64_t delta = stats_.after_.micros_ - stats_.before_.micros_;
|
| @@ -775,7 +714,6 @@ void Heap::RecordAfterGC(Space space) {
|
| #endif // !PRODUCT
|
| }
|
|
|
| -
|
| void Heap::PrintStats() {
|
| if (!FLAG_verbose_gc) return;
|
|
|
| @@ -842,7 +780,6 @@ void Heap::PrintStats() {
|
| // clang-format on
|
| }
|
|
|
| -
|
| void Heap::PrintStatsToTimeline(TimelineEventScope* event) {
|
| #if !defined(PRODUCT)
|
| if ((event == NULL) || !event->enabled()) {
|
| @@ -878,7 +815,6 @@ void Heap::PrintStatsToTimeline(TimelineEventScope* event) {
|
| #endif // !defined(PRODUCT)
|
| }
|
|
|
| -
|
| NoHeapGrowthControlScope::NoHeapGrowthControlScope()
|
| : StackResource(Thread::Current()) {
|
| Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
|
| @@ -886,19 +822,16 @@ NoHeapGrowthControlScope::NoHeapGrowthControlScope()
|
| heap->DisableGrowthControl();
|
| }
|
|
|
| -
|
| NoHeapGrowthControlScope::~NoHeapGrowthControlScope() {
|
| Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
|
| heap->SetGrowthControlState(current_growth_controller_state_);
|
| }
|
|
|
| -
|
| WritableVMIsolateScope::WritableVMIsolateScope(Thread* thread)
|
| : StackResource(thread) {
|
| Dart::vm_isolate()->heap()->WriteProtect(false);
|
| }
|
|
|
| -
|
| WritableVMIsolateScope::~WritableVMIsolateScope() {
|
| ASSERT(Dart::vm_isolate()->heap()->UsedInWords(Heap::kNew) == 0);
|
| Dart::vm_isolate()->heap()->WriteProtect(true);
|
|
|