| 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/pages.h" | 5 #include "vm/pages.h" |
| 6 | 6 |
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/compiler_stats.h" | 8 #include "vm/compiler_stats.h" |
| 9 #include "vm/gc_marker.h" | 9 #include "vm/gc_marker.h" |
| 10 #include "vm/gc_sweeper.h" | 10 #include "vm/gc_sweeper.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 pages_tail_(NULL), | 153 pages_tail_(NULL), |
| 154 exec_pages_(NULL), | 154 exec_pages_(NULL), |
| 155 exec_pages_tail_(NULL), | 155 exec_pages_tail_(NULL), |
| 156 large_pages_(NULL), | 156 large_pages_(NULL), |
| 157 bump_top_(0), | 157 bump_top_(0), |
| 158 bump_end_(0), | 158 bump_end_(0), |
| 159 max_capacity_in_words_(max_capacity_in_words), | 159 max_capacity_in_words_(max_capacity_in_words), |
| 160 max_external_in_words_(max_external_in_words), | 160 max_external_in_words_(max_external_in_words), |
| 161 tasks_lock_(new Monitor()), | 161 tasks_lock_(new Monitor()), |
| 162 tasks_(0), | 162 tasks_(0), |
| 163 #if defined(DEBUG) |
| 164 is_iterating_(false), |
| 165 #endif |
| 163 page_space_controller_(heap, | 166 page_space_controller_(heap, |
| 164 FLAG_old_gen_growth_space_ratio, | 167 FLAG_old_gen_growth_space_ratio, |
| 165 FLAG_old_gen_growth_rate, | 168 FLAG_old_gen_growth_rate, |
| 166 FLAG_old_gen_growth_time_ratio), | 169 FLAG_old_gen_growth_time_ratio), |
| 167 gc_time_micros_(0), | 170 gc_time_micros_(0), |
| 168 collections_(0) { | 171 collections_(0) { |
| 169 } | 172 } |
| 170 | 173 |
| 171 | 174 |
| 172 PageSpace::~PageSpace() { | 175 PageSpace::~PageSpace() { |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 | 774 |
| 772 if (FLAG_print_free_list_before_gc) { | 775 if (FLAG_print_free_list_before_gc) { |
| 773 OS::Print("Data Freelist (before GC):\n"); | 776 OS::Print("Data Freelist (before GC):\n"); |
| 774 freelist_[HeapPage::kData].Print(); | 777 freelist_[HeapPage::kData].Print(); |
| 775 OS::Print("Executable Freelist (before GC):\n"); | 778 OS::Print("Executable Freelist (before GC):\n"); |
| 776 freelist_[HeapPage::kExecutable].Print(); | 779 freelist_[HeapPage::kExecutable].Print(); |
| 777 } | 780 } |
| 778 | 781 |
| 779 if (FLAG_verify_before_gc) { | 782 if (FLAG_verify_before_gc) { |
| 780 OS::PrintErr("Verifying before marking..."); | 783 OS::PrintErr("Verifying before marking..."); |
| 781 heap_->Verify(); | 784 heap_->VerifyGC(); |
| 782 OS::PrintErr(" done.\n"); | 785 OS::PrintErr(" done.\n"); |
| 783 } | 786 } |
| 784 | 787 |
| 785 const int64_t start = OS::GetCurrentTimeMicros(); | 788 const int64_t start = OS::GetCurrentTimeMicros(); |
| 786 | 789 |
| 787 // Make code pages writable. | 790 // Make code pages writable. |
| 788 WriteProtectCode(false); | 791 WriteProtectCode(false); |
| 789 | 792 |
| 790 // Save old value before GCMarker visits the weak persistent handles. | 793 // Save old value before GCMarker visits the weak persistent handles. |
| 791 SpaceUsage usage_before = GetCurrentUsage(); | 794 SpaceUsage usage_before = GetCurrentUsage(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 803 // Reset the freelists and setup sweeping. | 806 // Reset the freelists and setup sweeping. |
| 804 freelist_[HeapPage::kData].Reset(); | 807 freelist_[HeapPage::kData].Reset(); |
| 805 freelist_[HeapPage::kExecutable].Reset(); | 808 freelist_[HeapPage::kExecutable].Reset(); |
| 806 | 809 |
| 807 int64_t mid2 = OS::GetCurrentTimeMicros(); | 810 int64_t mid2 = OS::GetCurrentTimeMicros(); |
| 808 int64_t mid3 = 0; | 811 int64_t mid3 = 0; |
| 809 | 812 |
| 810 { | 813 { |
| 811 if (FLAG_verify_before_gc) { | 814 if (FLAG_verify_before_gc) { |
| 812 OS::PrintErr("Verifying before sweeping..."); | 815 OS::PrintErr("Verifying before sweeping..."); |
| 813 heap_->Verify(kAllowMarked); | 816 heap_->VerifyGC(kAllowMarked); |
| 814 OS::PrintErr(" done.\n"); | 817 OS::PrintErr(" done.\n"); |
| 815 } | 818 } |
| 816 GCSweeper sweeper; | 819 GCSweeper sweeper; |
| 817 | 820 |
| 818 // During stop-the-world phases we should use bulk lock when adding elements | 821 // During stop-the-world phases we should use bulk lock when adding elements |
| 819 // to the free list. | 822 // to the free list. |
| 820 MutexLocker mld(freelist_[HeapPage::kData].mutex()); | 823 MutexLocker mld(freelist_[HeapPage::kData].mutex()); |
| 821 MutexLocker mle(freelist_[HeapPage::kExecutable].mutex()); | 824 MutexLocker mle(freelist_[HeapPage::kExecutable].mutex()); |
| 822 | 825 |
| 823 // Large and executable pages are always swept immediately. | 826 // Large and executable pages are always swept immediately. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 if (page_in_use) { | 867 if (page_in_use) { |
| 865 prev_page = page; | 868 prev_page = page; |
| 866 } else { | 869 } else { |
| 867 FreePage(page, prev_page); | 870 FreePage(page, prev_page); |
| 868 } | 871 } |
| 869 // Advance to the next page. | 872 // Advance to the next page. |
| 870 page = next_page; | 873 page = next_page; |
| 871 } | 874 } |
| 872 if (FLAG_verify_after_gc) { | 875 if (FLAG_verify_after_gc) { |
| 873 OS::PrintErr("Verifying after sweeping..."); | 876 OS::PrintErr("Verifying after sweeping..."); |
| 874 heap_->Verify(kForbidMarked); | 877 heap_->VerifyGC(kForbidMarked); |
| 875 OS::PrintErr(" done.\n"); | 878 OS::PrintErr(" done.\n"); |
| 876 } | 879 } |
| 877 } else { | 880 } else { |
| 878 // Start the concurrent sweeper task now. | 881 // Start the concurrent sweeper task now. |
| 879 GCSweeper::SweepConcurrent( | 882 GCSweeper::SweepConcurrent( |
| 880 isolate, pages_, pages_tail_, &freelist_[HeapPage::kData]); | 883 isolate, pages_, pages_tail_, &freelist_[HeapPage::kData]); |
| 881 } | 884 } |
| 882 } | 885 } |
| 883 | 886 |
| 884 // Make code pages read-only. | 887 // Make code pages read-only. |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 return 0; | 1137 return 0; |
| 1135 } else { | 1138 } else { |
| 1136 ASSERT(total_time >= gc_time); | 1139 ASSERT(total_time >= gc_time); |
| 1137 int result = static_cast<int>((static_cast<double>(gc_time) / | 1140 int result = static_cast<int>((static_cast<double>(gc_time) / |
| 1138 static_cast<double>(total_time)) * 100); | 1141 static_cast<double>(total_time)) * 100); |
| 1139 return result; | 1142 return result; |
| 1140 } | 1143 } |
| 1141 } | 1144 } |
| 1142 | 1145 |
| 1143 } // namespace dart | 1146 } // namespace dart |
| OLD | NEW |