| 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 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 | 771 |
| 772 if (FLAG_print_free_list_before_gc) { | 772 if (FLAG_print_free_list_before_gc) { |
| 773 OS::Print("Data Freelist (before GC):\n"); | 773 OS::Print("Data Freelist (before GC):\n"); |
| 774 freelist_[HeapPage::kData].Print(); | 774 freelist_[HeapPage::kData].Print(); |
| 775 OS::Print("Executable Freelist (before GC):\n"); | 775 OS::Print("Executable Freelist (before GC):\n"); |
| 776 freelist_[HeapPage::kExecutable].Print(); | 776 freelist_[HeapPage::kExecutable].Print(); |
| 777 } | 777 } |
| 778 | 778 |
| 779 if (FLAG_verify_before_gc) { | 779 if (FLAG_verify_before_gc) { |
| 780 OS::PrintErr("Verifying before marking..."); | 780 OS::PrintErr("Verifying before marking..."); |
| 781 heap_->Verify(); | 781 heap_->VerifyGC(); |
| 782 OS::PrintErr(" done.\n"); | 782 OS::PrintErr(" done.\n"); |
| 783 } | 783 } |
| 784 | 784 |
| 785 const int64_t start = OS::GetCurrentTimeMicros(); | 785 const int64_t start = OS::GetCurrentTimeMicros(); |
| 786 | 786 |
| 787 // Make code pages writable. | 787 // Make code pages writable. |
| 788 WriteProtectCode(false); | 788 WriteProtectCode(false); |
| 789 | 789 |
| 790 // Save old value before GCMarker visits the weak persistent handles. | 790 // Save old value before GCMarker visits the weak persistent handles. |
| 791 SpaceUsage usage_before = GetCurrentUsage(); | 791 SpaceUsage usage_before = GetCurrentUsage(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 803 // Reset the freelists and setup sweeping. | 803 // Reset the freelists and setup sweeping. |
| 804 freelist_[HeapPage::kData].Reset(); | 804 freelist_[HeapPage::kData].Reset(); |
| 805 freelist_[HeapPage::kExecutable].Reset(); | 805 freelist_[HeapPage::kExecutable].Reset(); |
| 806 | 806 |
| 807 int64_t mid2 = OS::GetCurrentTimeMicros(); | 807 int64_t mid2 = OS::GetCurrentTimeMicros(); |
| 808 int64_t mid3 = 0; | 808 int64_t mid3 = 0; |
| 809 | 809 |
| 810 { | 810 { |
| 811 if (FLAG_verify_before_gc) { | 811 if (FLAG_verify_before_gc) { |
| 812 OS::PrintErr("Verifying before sweeping..."); | 812 OS::PrintErr("Verifying before sweeping..."); |
| 813 heap_->Verify(kAllowMarked); | 813 heap_->VerifyGC(kAllowMarked); |
| 814 OS::PrintErr(" done.\n"); | 814 OS::PrintErr(" done.\n"); |
| 815 } | 815 } |
| 816 GCSweeper sweeper; | 816 GCSweeper sweeper; |
| 817 | 817 |
| 818 // During stop-the-world phases we should use bulk lock when adding elements | 818 // During stop-the-world phases we should use bulk lock when adding elements |
| 819 // to the free list. | 819 // to the free list. |
| 820 MutexLocker mld(freelist_[HeapPage::kData].mutex()); | 820 MutexLocker mld(freelist_[HeapPage::kData].mutex()); |
| 821 MutexLocker mle(freelist_[HeapPage::kExecutable].mutex()); | 821 MutexLocker mle(freelist_[HeapPage::kExecutable].mutex()); |
| 822 | 822 |
| 823 // Large and executable pages are always swept immediately. | 823 // 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) { | 864 if (page_in_use) { |
| 865 prev_page = page; | 865 prev_page = page; |
| 866 } else { | 866 } else { |
| 867 FreePage(page, prev_page); | 867 FreePage(page, prev_page); |
| 868 } | 868 } |
| 869 // Advance to the next page. | 869 // Advance to the next page. |
| 870 page = next_page; | 870 page = next_page; |
| 871 } | 871 } |
| 872 if (FLAG_verify_after_gc) { | 872 if (FLAG_verify_after_gc) { |
| 873 OS::PrintErr("Verifying after sweeping..."); | 873 OS::PrintErr("Verifying after sweeping..."); |
| 874 heap_->Verify(kForbidMarked); | 874 heap_->VerifyGC(kForbidMarked); |
| 875 OS::PrintErr(" done.\n"); | 875 OS::PrintErr(" done.\n"); |
| 876 } | 876 } |
| 877 } else { | 877 } else { |
| 878 // Start the concurrent sweeper task now. | 878 // Start the concurrent sweeper task now. |
| 879 GCSweeper::SweepConcurrent( | 879 GCSweeper::SweepConcurrent( |
| 880 isolate, pages_, pages_tail_, &freelist_[HeapPage::kData]); | 880 isolate, pages_, pages_tail_, &freelist_[HeapPage::kData]); |
| 881 } | 881 } |
| 882 } | 882 } |
| 883 | 883 |
| 884 // Make code pages read-only. | 884 // Make code pages read-only. |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 return 0; | 1134 return 0; |
| 1135 } else { | 1135 } else { |
| 1136 ASSERT(total_time >= gc_time); | 1136 ASSERT(total_time >= gc_time); |
| 1137 int result = static_cast<int>((static_cast<double>(gc_time) / | 1137 int result = static_cast<int>((static_cast<double>(gc_time) / |
| 1138 static_cast<double>(total_time)) * 100); | 1138 static_cast<double>(total_time)) * 100); |
| 1139 return result; | 1139 return result; |
| 1140 } | 1140 } |
| 1141 } | 1141 } |
| 1142 | 1142 |
| 1143 } // namespace dart | 1143 } // namespace dart |
| OLD | NEW |