Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: runtime/vm/pages.cc

Issue 534653002: Bump allocation for promotion (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/pages.h ('k') | runtime/vm/scavenger.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 763
764 // Done, reset the task count. 764 // Done, reset the task count.
765 { 765 {
766 MonitorLocker ml(tasks_lock()); 766 MonitorLocker ml(tasks_lock());
767 set_tasks(tasks() - 1); 767 set_tasks(tasks() - 1);
768 ml.Notify(); 768 ml.Notify();
769 } 769 }
770 } 770 }
771 771
772 772
773 uword PageSpace::TryAllocateDataBump(intptr_t size, 773 uword PageSpace::TryAllocateDataBumpInternal(intptr_t size,
774 GrowthPolicy growth_policy) { 774 GrowthPolicy growth_policy,
775 bool is_locked) {
775 ASSERT(size >= kObjectAlignment); 776 ASSERT(size >= kObjectAlignment);
776 ASSERT(Utils::IsAligned(size, kObjectAlignment)); 777 ASSERT(Utils::IsAligned(size, kObjectAlignment));
777 intptr_t remaining = bump_end_ - bump_top_; 778 intptr_t remaining = bump_end_ - bump_top_;
778 if (remaining < size) { 779 if (remaining < size) {
779 // Checking this first would be logical, but needlessly slow. 780 // Checking this first would be logical, but needlessly slow.
780 if (size >= kAllocatablePageSize) { 781 if (size >= kAllocatablePageSize) {
781 return TryAllocate(size, HeapPage::kData, growth_policy); 782 return is_locked ?
783 TryAllocateDataLocked(size, growth_policy) :
784 TryAllocate(size, HeapPage::kData, growth_policy);
782 } 785 }
783 FreeListElement* block = freelist_[HeapPage::kData].TryAllocateLarge(size); 786 FreeListElement* block = is_locked ?
787 freelist_[HeapPage::kData].TryAllocateLargeLocked(size) :
788 freelist_[HeapPage::kData].TryAllocateLarge(size);
784 if (block == NULL) { 789 if (block == NULL) {
785 // Allocating from a new page (if growth policy allows) will have the 790 // Allocating from a new page (if growth policy allows) will have the
786 // side-effect of populating the freelist with a large block. The next 791 // side-effect of populating the freelist with a large block. The next
787 // bump allocation request will have a chance to consume that block. 792 // bump allocation request will have a chance to consume that block.
788 // TODO(koda): Could take freelist lock just once instead of twice. 793 // TODO(koda): Could take freelist lock just once instead of twice.
789 return TryAllocateInFreshPage(size, 794 return TryAllocateInFreshPage(size,
790 HeapPage::kData, 795 HeapPage::kData,
791 growth_policy, 796 growth_policy,
792 /* is_locked = */ false); 797 is_locked);
793 } 798 }
794 intptr_t block_size = block->Size(); 799 intptr_t block_size = block->Size();
800 if (remaining > 0) {
801 if (is_locked) {
802 freelist_[HeapPage::kData].FreeLocked(bump_top_, remaining);
803 } else {
804 freelist_[HeapPage::kData].Free(bump_top_, remaining);
805 }
806 }
795 bump_top_ = reinterpret_cast<uword>(block); 807 bump_top_ = reinterpret_cast<uword>(block);
796 bump_end_ = bump_top_ + block_size; 808 bump_end_ = bump_top_ + block_size;
797 remaining = block_size; 809 remaining = block_size;
798 } 810 }
799 ASSERT(remaining >= size); 811 ASSERT(remaining >= size);
800 uword result = bump_top_; 812 uword result = bump_top_;
801 bump_top_ += size; 813 bump_top_ += size;
802 usage_.used_in_words += size >> kWordSizeLog2; 814 usage_.used_in_words += size >> kWordSizeLog2;
803 remaining -= size; 815 remaining -= size;
804 if (remaining > 0) { 816 if (remaining > 0) {
805 FreeListElement::AsElement(bump_top_, remaining); 817 FreeListElement::AsElement(bump_top_, remaining);
806 } 818 }
807 return result; 819 return result;
808 } 820 }
809 821
810 822
823 uword PageSpace::TryAllocateDataBump(intptr_t size,
824 GrowthPolicy growth_policy) {
825 return TryAllocateDataBumpInternal(size, growth_policy, false);
826 }
827
828
829 uword PageSpace::TryAllocateDataBumpLocked(intptr_t size,
830 GrowthPolicy growth_policy) {
831 return TryAllocateDataBumpInternal(size, growth_policy, true);
832 }
833
834
835 uword PageSpace::TryAllocatePromoLocked(intptr_t size,
836 GrowthPolicy growth_policy) {
837 FreeList* freelist = &freelist_[HeapPage::kData];
838 uword result = freelist->TryAllocateSmallLocked(size);
839 if (result != 0) {
840 usage_.used_in_words += size >> kWordSizeLog2;
841 return result;
842 }
843 result = TryAllocateDataBumpLocked(size, growth_policy);
844 if (result != 0) return result;
845 return TryAllocateDataLocked(size, growth_policy);
846 }
847
848
811 PageSpaceController::PageSpaceController(Heap* heap, 849 PageSpaceController::PageSpaceController(Heap* heap,
812 int heap_growth_ratio, 850 int heap_growth_ratio,
813 int heap_growth_max, 851 int heap_growth_max,
814 int garbage_collection_time_ratio) 852 int garbage_collection_time_ratio)
815 : heap_(heap), 853 : heap_(heap),
816 is_enabled_(false), 854 is_enabled_(false),
817 grow_heap_(heap_growth_max / 2), 855 grow_heap_(heap_growth_max / 2),
818 heap_growth_ratio_(heap_growth_ratio), 856 heap_growth_ratio_(heap_growth_ratio),
819 desired_utilization_((100.0 - heap_growth_ratio) / 100.0), 857 desired_utilization_((100.0 - heap_growth_ratio) / 100.0),
820 heap_growth_max_(heap_growth_max), 858 heap_growth_max_(heap_growth_max),
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 return 0; 971 return 0;
934 } else { 972 } else {
935 ASSERT(total_time >= gc_time); 973 ASSERT(total_time >= gc_time);
936 int result= static_cast<int>((static_cast<double>(gc_time) / 974 int result= static_cast<int>((static_cast<double>(gc_time) /
937 static_cast<double>(total_time)) * 100); 975 static_cast<double>(total_time)) * 100);
938 return result; 976 return result;
939 } 977 }
940 } 978 }
941 979
942 } // namespace dart 980 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/pages.h ('k') | runtime/vm/scavenger.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698