| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/heap.h" | 5 #include "vm/heap.h" |
| 6 | 6 |
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
| 9 #include "vm/flags.h" | 9 #include "vm/flags.h" |
| 10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 intptr_t max_external_words) | 32 intptr_t max_external_words) |
| 33 : isolate_(isolate), | 33 : isolate_(isolate), |
| 34 new_space_(this, max_new_gen_semi_words, kNewObjectAlignmentOffset), | 34 new_space_(this, max_new_gen_semi_words, kNewObjectAlignmentOffset), |
| 35 old_space_(this, max_old_gen_words, max_external_words), | 35 old_space_(this, max_old_gen_words, max_external_words), |
| 36 barrier_(new Monitor()), | 36 barrier_(new Monitor()), |
| 37 barrier_done_(new Monitor()), | 37 barrier_done_(new Monitor()), |
| 38 read_only_(false), | 38 read_only_(false), |
| 39 gc_new_space_in_progress_(false), | 39 gc_new_space_in_progress_(false), |
| 40 gc_old_space_in_progress_(false) { | 40 gc_old_space_in_progress_(false) { |
| 41 UpdateGlobalMaxUsed(); | 41 UpdateGlobalMaxUsed(); |
| 42 for (int sel = 0; | 42 for (int sel = 0; sel < kNumWeakSelectors; sel++) { |
| 43 sel < kNumWeakSelectors; | |
| 44 sel++) { | |
| 45 new_weak_tables_[sel] = new WeakTable(); | 43 new_weak_tables_[sel] = new WeakTable(); |
| 46 old_weak_tables_[sel] = new WeakTable(); | 44 old_weak_tables_[sel] = new WeakTable(); |
| 47 } | 45 } |
| 48 stats_.num_ = 0; | 46 stats_.num_ = 0; |
| 49 } | 47 } |
| 50 | 48 |
| 51 | 49 |
| 52 Heap::~Heap() { | 50 Heap::~Heap() { |
| 53 delete barrier_; | 51 delete barrier_; |
| 54 delete barrier_done_; | 52 delete barrier_done_; |
| 55 | 53 |
| 56 for (int sel = 0; | 54 for (int sel = 0; sel < kNumWeakSelectors; sel++) { |
| 57 sel < kNumWeakSelectors; | |
| 58 sel++) { | |
| 59 delete new_weak_tables_[sel]; | 55 delete new_weak_tables_[sel]; |
| 60 delete old_weak_tables_[sel]; | 56 delete old_weak_tables_[sel]; |
| 61 } | 57 } |
| 62 } | 58 } |
| 63 | 59 |
| 64 | 60 |
| 65 uword Heap::AllocateNew(intptr_t size) { | 61 uword Heap::AllocateNew(intptr_t size) { |
| 66 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0); | 62 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0); |
| 67 // Currently, only the Dart thread may allocate in new space. | 63 // Currently, only the Dart thread may allocate in new space. |
| 68 isolate()->AssertCurrentThreadIsMutator(); | 64 isolate()->AssertCurrentThreadIsMutator(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 while (old_space_.tasks() > 0) { | 128 while (old_space_.tasks() > 0) { |
| 133 ml.WaitWithSafepointCheck(thread); | 129 ml.WaitWithSafepointCheck(thread); |
| 134 } | 130 } |
| 135 } | 131 } |
| 136 } | 132 } |
| 137 addr = old_space_.TryAllocate(size, type, PageSpace::kForceGrowth); | 133 addr = old_space_.TryAllocate(size, type, PageSpace::kForceGrowth); |
| 138 if (addr != 0) { | 134 if (addr != 0) { |
| 139 return addr; | 135 return addr; |
| 140 } | 136 } |
| 141 // Give up allocating this object. | 137 // Give up allocating this object. |
| 142 OS::PrintErr( | 138 OS::PrintErr("Exhausted heap space, trying to allocate %" Pd " bytes.\n", |
| 143 "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size); | 139 size); |
| 144 return 0; | 140 return 0; |
| 145 } | 141 } |
| 146 | 142 |
| 147 | 143 |
| 148 void Heap::AllocateExternal(intptr_t size, Space space) { | 144 void Heap::AllocateExternal(intptr_t size, Space space) { |
| 149 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0); | 145 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0); |
| 150 if (space == kNew) { | 146 if (space == kNew) { |
| 151 isolate()->AssertCurrentThreadIsMutator(); | 147 isolate()->AssertCurrentThreadIsMutator(); |
| 152 new_space_.AllocateExternal(size); | 148 new_space_.AllocateExternal(size); |
| 153 if (new_space_.ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) { | 149 if (new_space_.ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 172 old_space_.FreeExternal(size); | 168 old_space_.FreeExternal(size); |
| 173 } | 169 } |
| 174 } | 170 } |
| 175 | 171 |
| 176 void Heap::PromoteExternal(intptr_t size) { | 172 void Heap::PromoteExternal(intptr_t size) { |
| 177 new_space_.FreeExternal(size); | 173 new_space_.FreeExternal(size); |
| 178 old_space_.AllocateExternal(size); | 174 old_space_.AllocateExternal(size); |
| 179 } | 175 } |
| 180 | 176 |
| 181 bool Heap::Contains(uword addr) const { | 177 bool Heap::Contains(uword addr) const { |
| 182 return new_space_.Contains(addr) || | 178 return new_space_.Contains(addr) || old_space_.Contains(addr); |
| 183 old_space_.Contains(addr); | |
| 184 } | 179 } |
| 185 | 180 |
| 186 | 181 |
| 187 bool Heap::NewContains(uword addr) const { | 182 bool Heap::NewContains(uword addr) const { |
| 188 return new_space_.Contains(addr); | 183 return new_space_.Contains(addr); |
| 189 } | 184 } |
| 190 | 185 |
| 191 | 186 |
| 192 bool Heap::OldContains(uword addr) const { | 187 bool Heap::OldContains(uword addr) const { |
| 193 return old_space_.Contains(addr); | 188 return old_space_.Contains(addr); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 return raw_obj; | 291 return raw_obj; |
| 297 } | 292 } |
| 298 raw_obj = FindObjectInCodeSpace(visitor); | 293 raw_obj = FindObjectInCodeSpace(visitor); |
| 299 return raw_obj; | 294 return raw_obj; |
| 300 } | 295 } |
| 301 | 296 |
| 302 | 297 |
| 303 bool Heap::BeginNewSpaceGC(Thread* thread) { | 298 bool Heap::BeginNewSpaceGC(Thread* thread) { |
| 304 MonitorLocker ml(&gc_in_progress_monitor_); | 299 MonitorLocker ml(&gc_in_progress_monitor_); |
| 305 bool start_gc_on_thread = true; | 300 bool start_gc_on_thread = true; |
| 306 while (gc_new_space_in_progress_ || | 301 while (gc_new_space_in_progress_ || gc_old_space_in_progress_) { |
| 307 gc_old_space_in_progress_) { | |
| 308 start_gc_on_thread = !gc_new_space_in_progress_; | 302 start_gc_on_thread = !gc_new_space_in_progress_; |
| 309 ml.WaitWithSafepointCheck(thread); | 303 ml.WaitWithSafepointCheck(thread); |
| 310 } | 304 } |
| 311 if (start_gc_on_thread) { | 305 if (start_gc_on_thread) { |
| 312 gc_new_space_in_progress_ = true; | 306 gc_new_space_in_progress_ = true; |
| 313 return true; | 307 return true; |
| 314 } | 308 } |
| 315 return false; | 309 return false; |
| 316 } | 310 } |
| 317 | 311 |
| 318 | 312 |
| 319 void Heap::EndNewSpaceGC() { | 313 void Heap::EndNewSpaceGC() { |
| 320 MonitorLocker ml(&gc_in_progress_monitor_); | 314 MonitorLocker ml(&gc_in_progress_monitor_); |
| 321 ASSERT(gc_new_space_in_progress_); | 315 ASSERT(gc_new_space_in_progress_); |
| 322 gc_new_space_in_progress_ = false; | 316 gc_new_space_in_progress_ = false; |
| 323 ml.NotifyAll(); | 317 ml.NotifyAll(); |
| 324 } | 318 } |
| 325 | 319 |
| 326 | 320 |
| 327 bool Heap::BeginOldSpaceGC(Thread* thread) { | 321 bool Heap::BeginOldSpaceGC(Thread* thread) { |
| 328 MonitorLocker ml(&gc_in_progress_monitor_); | 322 MonitorLocker ml(&gc_in_progress_monitor_); |
| 329 bool start_gc_on_thread = true; | 323 bool start_gc_on_thread = true; |
| 330 while (gc_new_space_in_progress_ || | 324 while (gc_new_space_in_progress_ || gc_old_space_in_progress_) { |
| 331 gc_old_space_in_progress_) { | |
| 332 start_gc_on_thread = !gc_old_space_in_progress_; | 325 start_gc_on_thread = !gc_old_space_in_progress_; |
| 333 ml.WaitWithSafepointCheck(thread); | 326 ml.WaitWithSafepointCheck(thread); |
| 334 } | 327 } |
| 335 if (start_gc_on_thread) { | 328 if (start_gc_on_thread) { |
| 336 gc_old_space_in_progress_ = true; | 329 gc_old_space_in_progress_ = true; |
| 337 return true; | 330 return true; |
| 338 } | 331 } |
| 339 return false; | 332 return false; |
| 340 } | 333 } |
| 341 | 334 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 return OFFSET_OF(Heap, old_space_) + PageSpace::end_offset(); | 497 return OFFSET_OF(Heap, old_space_) + PageSpace::end_offset(); |
| 505 } | 498 } |
| 506 } | 499 } |
| 507 | 500 |
| 508 | 501 |
| 509 void Heap::Init(Isolate* isolate, | 502 void Heap::Init(Isolate* isolate, |
| 510 intptr_t max_new_gen_words, | 503 intptr_t max_new_gen_words, |
| 511 intptr_t max_old_gen_words, | 504 intptr_t max_old_gen_words, |
| 512 intptr_t max_external_words) { | 505 intptr_t max_external_words) { |
| 513 ASSERT(isolate->heap() == NULL); | 506 ASSERT(isolate->heap() == NULL); |
| 514 Heap* heap = new Heap(isolate, | 507 Heap* heap = new Heap(isolate, max_new_gen_words, max_old_gen_words, |
| 515 max_new_gen_words, | |
| 516 max_old_gen_words, | |
| 517 max_external_words); | 508 max_external_words); |
| 518 isolate->set_heap(heap); | 509 isolate->set_heap(heap); |
| 519 } | 510 } |
| 520 | 511 |
| 521 | 512 |
| 522 void Heap::AddRegionsToObjectSet(ObjectSet* set) const { | 513 void Heap::AddRegionsToObjectSet(ObjectSet* set) const { |
| 523 new_space_.AddRegionsToObjectSet(set); | 514 new_space_.AddRegionsToObjectSet(set); |
| 524 old_space_.AddRegionsToObjectSet(set); | 515 old_space_.AddRegionsToObjectSet(set); |
| 525 } | 516 } |
| 526 | 517 |
| 527 | 518 |
| 528 ObjectSet* Heap::CreateAllocatedObjectSet( | 519 ObjectSet* Heap::CreateAllocatedObjectSet( |
| 529 Zone* zone, | 520 Zone* zone, |
| 530 MarkExpectation mark_expectation) const { | 521 MarkExpectation mark_expectation) const { |
| 531 ObjectSet* allocated_set = new(zone) ObjectSet(zone); | 522 ObjectSet* allocated_set = new (zone) ObjectSet(zone); |
| 532 | 523 |
| 533 this->AddRegionsToObjectSet(allocated_set); | 524 this->AddRegionsToObjectSet(allocated_set); |
| 534 { | 525 { |
| 535 VerifyObjectVisitor object_visitor( | 526 VerifyObjectVisitor object_visitor(isolate(), allocated_set, |
| 536 isolate(), allocated_set, mark_expectation); | 527 mark_expectation); |
| 537 this->VisitObjects(&object_visitor); | 528 this->VisitObjects(&object_visitor); |
| 538 } | 529 } |
| 539 | 530 |
| 540 Isolate* vm_isolate = Dart::vm_isolate(); | 531 Isolate* vm_isolate = Dart::vm_isolate(); |
| 541 vm_isolate->heap()->AddRegionsToObjectSet(allocated_set); | 532 vm_isolate->heap()->AddRegionsToObjectSet(allocated_set); |
| 542 { | 533 { |
| 543 // VM isolate heap is premarked. | 534 // VM isolate heap is premarked. |
| 544 VerifyObjectVisitor vm_object_visitor( | 535 VerifyObjectVisitor vm_object_visitor(isolate(), allocated_set, |
| 545 isolate(), allocated_set, kRequireMarked); | 536 kRequireMarked); |
| 546 vm_isolate->heap()->VisitObjects(&vm_object_visitor); | 537 vm_isolate->heap()->VisitObjects(&vm_object_visitor); |
| 547 } | 538 } |
| 548 | 539 |
| 549 return allocated_set; | 540 return allocated_set; |
| 550 } | 541 } |
| 551 | 542 |
| 552 | 543 |
| 553 bool Heap::Verify(MarkExpectation mark_expectation) const { | 544 bool Heap::Verify(MarkExpectation mark_expectation) const { |
| 554 HeapIterationScope heap_iteration_scope; | 545 HeapIterationScope heap_iteration_scope; |
| 555 return VerifyGC(mark_expectation); | 546 return VerifyGC(mark_expectation); |
| 556 } | 547 } |
| 557 | 548 |
| 558 | 549 |
| 559 bool Heap::VerifyGC(MarkExpectation mark_expectation) const { | 550 bool Heap::VerifyGC(MarkExpectation mark_expectation) const { |
| 560 StackZone stack_zone(Thread::Current()); | 551 StackZone stack_zone(Thread::Current()); |
| 561 ObjectSet* allocated_set = CreateAllocatedObjectSet(stack_zone.GetZone(), | 552 ObjectSet* allocated_set = |
| 562 mark_expectation); | 553 CreateAllocatedObjectSet(stack_zone.GetZone(), mark_expectation); |
| 563 VerifyPointersVisitor visitor(isolate(), allocated_set); | 554 VerifyPointersVisitor visitor(isolate(), allocated_set); |
| 564 VisitObjectPointers(&visitor); | 555 VisitObjectPointers(&visitor); |
| 565 | 556 |
| 566 // Only returning a value so that Heap::Validate can be called from an ASSERT. | 557 // Only returning a value so that Heap::Validate can be called from an ASSERT. |
| 567 return true; | 558 return true; |
| 568 } | 559 } |
| 569 | 560 |
| 570 | 561 |
| 571 void Heap::PrintSizes() const { | 562 void Heap::PrintSizes() const { |
| 572 OS::PrintErr("New space (%" Pd64 "k of %" Pd64 "k) " | 563 OS::PrintErr( |
| 573 "Old space (%" Pd64 "k of %" Pd64 "k)\n", | 564 "New space (%" Pd64 "k of %" Pd64 |
| 574 (UsedInWords(kNew) / KBInWords), | 565 "k) " |
| 575 (CapacityInWords(kNew) / KBInWords), | 566 "Old space (%" Pd64 "k of %" Pd64 "k)\n", |
| 576 (UsedInWords(kOld) / KBInWords), | 567 (UsedInWords(kNew) / KBInWords), (CapacityInWords(kNew) / KBInWords), |
| 577 (CapacityInWords(kOld) / KBInWords)); | 568 (UsedInWords(kOld) / KBInWords), (CapacityInWords(kOld) / KBInWords)); |
| 578 } | 569 } |
| 579 | 570 |
| 580 | 571 |
| 581 int64_t Heap::UsedInWords(Space space) const { | 572 int64_t Heap::UsedInWords(Space space) const { |
| 582 return space == kNew ? new_space_.UsedInWords() : old_space_.UsedInWords(); | 573 return space == kNew ? new_space_.UsedInWords() : old_space_.UsedInWords(); |
| 583 } | 574 } |
| 584 | 575 |
| 585 | 576 |
| 586 int64_t Heap::CapacityInWords(Space space) const { | 577 int64_t Heap::CapacityInWords(Space space) const { |
| 587 return space == kNew ? new_space_.CapacityInWords() : | 578 return space == kNew ? new_space_.CapacityInWords() |
| 588 old_space_.CapacityInWords(); | 579 : old_space_.CapacityInWords(); |
| 589 } | 580 } |
| 590 | 581 |
| 591 | 582 |
| 592 int64_t Heap::ExternalInWords(Space space) const { | 583 int64_t Heap::ExternalInWords(Space space) const { |
| 593 return space == kNew ? new_space_.ExternalInWords() : | 584 return space == kNew ? new_space_.ExternalInWords() |
| 594 old_space_.ExternalInWords(); | 585 : old_space_.ExternalInWords(); |
| 595 } | 586 } |
| 596 | 587 |
| 597 | 588 |
| 598 int64_t Heap::GCTimeInMicros(Space space) const { | 589 int64_t Heap::GCTimeInMicros(Space space) const { |
| 599 if (space == kNew) { | 590 if (space == kNew) { |
| 600 return new_space_.gc_time_micros(); | 591 return new_space_.gc_time_micros(); |
| 601 } | 592 } |
| 602 return old_space_.gc_time_micros(); | 593 return old_space_.gc_time_micros(); |
| 603 } | 594 } |
| 604 | 595 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 632 } | 623 } |
| 633 | 624 |
| 634 | 625 |
| 635 int64_t Heap::PeerCount() const { | 626 int64_t Heap::PeerCount() const { |
| 636 return new_weak_tables_[kPeers]->count() + old_weak_tables_[kPeers]->count(); | 627 return new_weak_tables_[kPeers]->count() + old_weak_tables_[kPeers]->count(); |
| 637 } | 628 } |
| 638 | 629 |
| 639 | 630 |
| 640 int64_t Heap::HashCount() const { | 631 int64_t Heap::HashCount() const { |
| 641 return new_weak_tables_[kHashes]->count() + | 632 return new_weak_tables_[kHashes]->count() + |
| 642 old_weak_tables_[kHashes]->count(); | 633 old_weak_tables_[kHashes]->count(); |
| 643 } | 634 } |
| 644 | 635 |
| 645 | 636 |
| 646 int64_t Heap::ObjectIdCount() const { | 637 int64_t Heap::ObjectIdCount() const { |
| 647 return new_weak_tables_[kObjectIds]->count() + | 638 return new_weak_tables_[kObjectIds]->count() + |
| 648 old_weak_tables_[kObjectIds]->count(); | 639 old_weak_tables_[kObjectIds]->count(); |
| 649 } | 640 } |
| 650 | 641 |
| 651 | 642 |
| 652 void Heap::ResetObjectIdTable() { | 643 void Heap::ResetObjectIdTable() { |
| 653 new_weak_tables_[kObjectIds]->Reset(); | 644 new_weak_tables_[kObjectIds]->Reset(); |
| 654 old_weak_tables_[kObjectIds]->Reset(); | 645 old_weak_tables_[kObjectIds]->Reset(); |
| 655 } | 646 } |
| 656 | 647 |
| 657 | 648 |
| 658 intptr_t Heap::GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const { | 649 intptr_t Heap::GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 } | 718 } |
| 728 #endif // !PRODUCT | 719 #endif // !PRODUCT |
| 729 } | 720 } |
| 730 | 721 |
| 731 | 722 |
| 732 void Heap::PrintStats() { | 723 void Heap::PrintStats() { |
| 733 if (!FLAG_verbose_gc) return; | 724 if (!FLAG_verbose_gc) return; |
| 734 | 725 |
| 735 if ((FLAG_verbose_gc_hdr != 0) && | 726 if ((FLAG_verbose_gc_hdr != 0) && |
| 736 (((stats_.num_ - 1) % FLAG_verbose_gc_hdr) == 0)) { | 727 (((stats_.num_ - 1) % FLAG_verbose_gc_hdr) == 0)) { |
| 737 OS::PrintErr("[ GC | space | count | start | gc time | " | 728 OS::PrintErr( |
| 738 "new gen (KB) | old gen (KB) | timers | data ]\n" | 729 "[ GC | space | count | start | gc time | " |
| 739 "[ (isolate)| (reason)| | (s) | (ms) | " | 730 "new gen (KB) | old gen (KB) | timers | data ]\n" |
| 740 "used,cap,ext | used,cap,ext | (ms) | ]\n"); | 731 "[ (isolate)| (reason)| | (s) | (ms) | " |
| 732 "used,cap,ext | used,cap,ext | (ms) | ]\n"); |
| 741 } | 733 } |
| 742 | 734 |
| 735 // clang-format off |
| 743 const char* space_str = stats_.space_ == kNew ? "Scavenge" : "Mark-Sweep"; | 736 const char* space_str = stats_.space_ == kNew ? "Scavenge" : "Mark-Sweep"; |
| 744 OS::PrintErr( | 737 OS::PrintErr( |
| 745 "[ GC(%" Pd64 "): %s(%s), " // GC(isolate), space(reason) | 738 "[ GC(%" Pd64 "): %s(%s), " // GC(isolate), space(reason) |
| 746 "%" Pd ", " // count | 739 "%" Pd ", " // count |
| 747 "%.3f, " // start time | 740 "%.3f, " // start time |
| 748 "%.3f, " // total time | 741 "%.3f, " // total time |
| 749 "%" Pd ", %" Pd ", " // new gen: in use before/after | 742 "%" Pd ", %" Pd ", " // new gen: in use before/after |
| 750 "%" Pd ", %" Pd ", " // new gen: capacity before/after | 743 "%" Pd ", %" Pd ", " // new gen: capacity before/after |
| 751 "%" Pd ", %" Pd ", " // new gen: external before/after | 744 "%" Pd ", %" Pd ", " // new gen: external before/after |
| 752 "%" Pd ", %" Pd ", " // old gen: in use before/after | 745 "%" Pd ", %" Pd ", " // old gen: in use before/after |
| (...skipping 20 matching lines...) Expand all Loading... |
| 773 RoundWordsToKB(stats_.before_.old_.external_in_words), | 766 RoundWordsToKB(stats_.before_.old_.external_in_words), |
| 774 RoundWordsToKB(stats_.after_.old_.external_in_words), | 767 RoundWordsToKB(stats_.after_.old_.external_in_words), |
| 775 MicrosecondsToMilliseconds(stats_.times_[0]), | 768 MicrosecondsToMilliseconds(stats_.times_[0]), |
| 776 MicrosecondsToMilliseconds(stats_.times_[1]), | 769 MicrosecondsToMilliseconds(stats_.times_[1]), |
| 777 MicrosecondsToMilliseconds(stats_.times_[2]), | 770 MicrosecondsToMilliseconds(stats_.times_[2]), |
| 778 MicrosecondsToMilliseconds(stats_.times_[3]), | 771 MicrosecondsToMilliseconds(stats_.times_[3]), |
| 779 stats_.data_[0], | 772 stats_.data_[0], |
| 780 stats_.data_[1], | 773 stats_.data_[1], |
| 781 stats_.data_[2], | 774 stats_.data_[2], |
| 782 stats_.data_[3]); | 775 stats_.data_[3]); |
| 776 // clang-format on |
| 783 } | 777 } |
| 784 | 778 |
| 785 | 779 |
| 786 void Heap::PrintStatsToTimeline(TimelineEventScope* event) { | 780 void Heap::PrintStatsToTimeline(TimelineEventScope* event) { |
| 787 #if !defined(PRODUCT) | 781 #if !defined(PRODUCT) |
| 788 if ((event == NULL) || !event->enabled()) { | 782 if ((event == NULL) || !event->enabled()) { |
| 789 return; | 783 return; |
| 790 } | 784 } |
| 791 event->SetNumArguments(12); | 785 event->SetNumArguments(12); |
| 792 event->FormatArgument(0, | 786 event->FormatArgument(0, "Before.New.Used (kB)", "%" Pd "", |
| 793 "Before.New.Used (kB)", | |
| 794 "%" Pd "", | |
| 795 RoundWordsToKB(stats_.before_.new_.used_in_words)); | 787 RoundWordsToKB(stats_.before_.new_.used_in_words)); |
| 796 event->FormatArgument(1, | 788 event->FormatArgument(1, "After.New.Used (kB)", "%" Pd "", |
| 797 "After.New.Used (kB)", | |
| 798 "%" Pd "", | |
| 799 RoundWordsToKB(stats_.after_.new_.used_in_words)); | 789 RoundWordsToKB(stats_.after_.new_.used_in_words)); |
| 800 event->FormatArgument(2, | 790 event->FormatArgument(2, "Before.Old.Used (kB)", "%" Pd "", |
| 801 "Before.Old.Used (kB)", | |
| 802 "%" Pd "", | |
| 803 RoundWordsToKB(stats_.before_.old_.used_in_words)); | 791 RoundWordsToKB(stats_.before_.old_.used_in_words)); |
| 804 event->FormatArgument(3, | 792 event->FormatArgument(3, "After.Old.Used (kB)", "%" Pd "", |
| 805 "After.Old.Used (kB)", | |
| 806 "%" Pd "", | |
| 807 RoundWordsToKB(stats_.after_.old_.used_in_words)); | 793 RoundWordsToKB(stats_.after_.old_.used_in_words)); |
| 808 | 794 |
| 809 event->FormatArgument(4, | 795 event->FormatArgument(4, "Before.New.Capacity (kB)", "%" Pd "", |
| 810 "Before.New.Capacity (kB)", | |
| 811 "%" Pd "", | |
| 812 RoundWordsToKB(stats_.before_.new_.capacity_in_words)); | 796 RoundWordsToKB(stats_.before_.new_.capacity_in_words)); |
| 813 event->FormatArgument(5, | 797 event->FormatArgument(5, "After.New.Capacity (kB)", "%" Pd "", |
| 814 "After.New.Capacity (kB)", | |
| 815 "%" Pd "", | |
| 816 RoundWordsToKB(stats_.after_.new_.capacity_in_words)); | 798 RoundWordsToKB(stats_.after_.new_.capacity_in_words)); |
| 817 event->FormatArgument(6, | 799 event->FormatArgument(6, "Before.Old.Capacity (kB)", "%" Pd "", |
| 818 "Before.Old.Capacity (kB)", | |
| 819 "%" Pd "", | |
| 820 RoundWordsToKB(stats_.before_.old_.capacity_in_words)); | 800 RoundWordsToKB(stats_.before_.old_.capacity_in_words)); |
| 821 event->FormatArgument(7, | 801 event->FormatArgument(7, "After.Old.Capacity (kB)", "%" Pd "", |
| 822 "After.Old.Capacity (kB)", | |
| 823 "%" Pd "", | |
| 824 RoundWordsToKB(stats_.after_.old_.capacity_in_words)); | 802 RoundWordsToKB(stats_.after_.old_.capacity_in_words)); |
| 825 | 803 |
| 826 event->FormatArgument(8, | 804 event->FormatArgument(8, "Before.New.External (kB)", "%" Pd "", |
| 827 "Before.New.External (kB)", | |
| 828 "%" Pd "", | |
| 829 RoundWordsToKB(stats_.before_.new_.external_in_words)); | 805 RoundWordsToKB(stats_.before_.new_.external_in_words)); |
| 830 event->FormatArgument(9, | 806 event->FormatArgument(9, "After.New.External (kB)", "%" Pd "", |
| 831 "After.New.External (kB)", | |
| 832 "%" Pd "", | |
| 833 RoundWordsToKB(stats_.after_.new_.external_in_words)); | 807 RoundWordsToKB(stats_.after_.new_.external_in_words)); |
| 834 event->FormatArgument(10, | 808 event->FormatArgument(10, "Before.Old.External (kB)", "%" Pd "", |
| 835 "Before.Old.External (kB)", | |
| 836 "%" Pd "", | |
| 837 RoundWordsToKB(stats_.before_.old_.external_in_words)); | 809 RoundWordsToKB(stats_.before_.old_.external_in_words)); |
| 838 event->FormatArgument(11, | 810 event->FormatArgument(11, "After.Old.External (kB)", "%" Pd "", |
| 839 "After.Old.External (kB)", | |
| 840 "%" Pd "", | |
| 841 RoundWordsToKB(stats_.after_.old_.external_in_words)); | 811 RoundWordsToKB(stats_.after_.old_.external_in_words)); |
| 842 #endif // !defined(PRODUCT) | 812 #endif // !defined(PRODUCT) |
| 843 } | 813 } |
| 844 | 814 |
| 845 | 815 |
| 846 NoHeapGrowthControlScope::NoHeapGrowthControlScope() | 816 NoHeapGrowthControlScope::NoHeapGrowthControlScope() |
| 847 : StackResource(Thread::Current()) { | 817 : StackResource(Thread::Current()) { |
| 848 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); | 818 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); |
| 849 current_growth_controller_state_ = heap->GrowthControlState(); | 819 current_growth_controller_state_ = heap->GrowthControlState(); |
| 850 heap->DisableGrowthControl(); | 820 heap->DisableGrowthControl(); |
| 851 } | 821 } |
| 852 | 822 |
| 853 | 823 |
| 854 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() { | 824 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() { |
| 855 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); | 825 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); |
| 856 heap->SetGrowthControlState(current_growth_controller_state_); | 826 heap->SetGrowthControlState(current_growth_controller_state_); |
| 857 } | 827 } |
| 858 | 828 |
| 859 | 829 |
| 860 WritableVMIsolateScope::WritableVMIsolateScope(Thread* thread) | 830 WritableVMIsolateScope::WritableVMIsolateScope(Thread* thread) |
| 861 : StackResource(thread) { | 831 : StackResource(thread) { |
| 862 Dart::vm_isolate()->heap()->WriteProtect(false); | 832 Dart::vm_isolate()->heap()->WriteProtect(false); |
| 863 } | 833 } |
| 864 | 834 |
| 865 | 835 |
| 866 WritableVMIsolateScope::~WritableVMIsolateScope() { | 836 WritableVMIsolateScope::~WritableVMIsolateScope() { |
| 867 ASSERT(Dart::vm_isolate()->heap()->UsedInWords(Heap::kNew) == 0); | 837 ASSERT(Dart::vm_isolate()->heap()->UsedInWords(Heap::kNew) == 0); |
| 868 Dart::vm_isolate()->heap()->WriteProtect(true); | 838 Dart::vm_isolate()->heap()->WriteProtect(true); |
| 869 } | 839 } |
| 870 | 840 |
| 871 } // namespace dart | 841 } // namespace dart |
| OLD | NEW |