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

Side by Side Diff: src/spaces.cc

Issue 174052: Reapply the semispace growth policy change in isolation.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 4 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 | « src/spaces.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 bool NewSpace::Setup(Address start, int size) { 855 bool NewSpace::Setup(Address start, int size) {
856 // Setup new space based on the preallocated memory block defined by 856 // Setup new space based on the preallocated memory block defined by
857 // start and size. The provided space is divided into two semi-spaces. 857 // start and size. The provided space is divided into two semi-spaces.
858 // To support fast containment testing in the new space, the size of 858 // To support fast containment testing in the new space, the size of
859 // this chunk must be a power of two and it must be aligned to its size. 859 // this chunk must be a power of two and it must be aligned to its size.
860 int initial_semispace_capacity = Heap::InitialSemiSpaceSize(); 860 int initial_semispace_capacity = Heap::InitialSemiSpaceSize();
861 int maximum_semispace_capacity = Heap::SemiSpaceSize(); 861 int maximum_semispace_capacity = Heap::SemiSpaceSize();
862 862
863 ASSERT(initial_semispace_capacity <= maximum_semispace_capacity); 863 ASSERT(initial_semispace_capacity <= maximum_semispace_capacity);
864 ASSERT(IsPowerOf2(maximum_semispace_capacity)); 864 ASSERT(IsPowerOf2(maximum_semispace_capacity));
865 maximum_capacity_ = maximum_semispace_capacity;
866 capacity_ = initial_semispace_capacity;
867 865
868 // Allocate and setup the histogram arrays if necessary. 866 // Allocate and setup the histogram arrays if necessary.
869 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) 867 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING)
870 allocated_histogram_ = NewArray<HistogramInfo>(LAST_TYPE + 1); 868 allocated_histogram_ = NewArray<HistogramInfo>(LAST_TYPE + 1);
871 promoted_histogram_ = NewArray<HistogramInfo>(LAST_TYPE + 1); 869 promoted_histogram_ = NewArray<HistogramInfo>(LAST_TYPE + 1);
872 870
873 #define SET_NAME(name) allocated_histogram_[name].set_name(#name); \ 871 #define SET_NAME(name) allocated_histogram_[name].set_name(#name); \
874 promoted_histogram_[name].set_name(#name); 872 promoted_histogram_[name].set_name(#name);
875 INSTANCE_TYPE_LIST(SET_NAME) 873 INSTANCE_TYPE_LIST(SET_NAME)
876 #undef SET_NAME 874 #undef SET_NAME
877 #endif 875 #endif
878 876
879 ASSERT(size == 2 * maximum_capacity_); 877 ASSERT(size == 2 * maximum_semispace_capacity);
880 ASSERT(IsAddressAligned(start, size, 0)); 878 ASSERT(IsAddressAligned(start, size, 0));
881 879
882 if (!to_space_.Setup(start, capacity_, maximum_capacity_)) { 880 if (!to_space_.Setup(start,
881 initial_semispace_capacity,
882 maximum_semispace_capacity)) {
883 return false; 883 return false;
884 } 884 }
885 if (!from_space_.Setup(start + maximum_capacity_, 885 if (!from_space_.Setup(start + maximum_semispace_capacity,
886 capacity_, 886 initial_semispace_capacity,
887 maximum_capacity_)) { 887 maximum_semispace_capacity)) {
888 return false; 888 return false;
889 } 889 }
890 890
891 start_ = start; 891 start_ = start;
892 address_mask_ = ~(size - 1); 892 address_mask_ = ~(size - 1);
893 object_mask_ = address_mask_ | kHeapObjectTag; 893 object_mask_ = address_mask_ | kHeapObjectTag;
894 object_expected_ = reinterpret_cast<uintptr_t>(start) | kHeapObjectTag; 894 object_expected_ = reinterpret_cast<uintptr_t>(start) | kHeapObjectTag;
895 895
896 allocation_info_.top = to_space_.low(); 896 allocation_info_.top = to_space_.low();
897 allocation_info_.limit = to_space_.high(); 897 allocation_info_.limit = to_space_.high();
(...skipping 11 matching lines...) Expand all
909 DeleteArray(allocated_histogram_); 909 DeleteArray(allocated_histogram_);
910 allocated_histogram_ = NULL; 910 allocated_histogram_ = NULL;
911 } 911 }
912 if (promoted_histogram_) { 912 if (promoted_histogram_) {
913 DeleteArray(promoted_histogram_); 913 DeleteArray(promoted_histogram_);
914 promoted_histogram_ = NULL; 914 promoted_histogram_ = NULL;
915 } 915 }
916 #endif 916 #endif
917 917
918 start_ = NULL; 918 start_ = NULL;
919 capacity_ = 0;
920 allocation_info_.top = NULL; 919 allocation_info_.top = NULL;
921 allocation_info_.limit = NULL; 920 allocation_info_.limit = NULL;
922 mc_forwarding_info_.top = NULL; 921 mc_forwarding_info_.top = NULL;
923 mc_forwarding_info_.limit = NULL; 922 mc_forwarding_info_.limit = NULL;
924 923
925 to_space_.TearDown(); 924 to_space_.TearDown();
926 from_space_.TearDown(); 925 from_space_.TearDown();
927 } 926 }
928 927
929 928
(...skipping 15 matching lines...) Expand all
945 #endif 944 #endif
946 945
947 946
948 void NewSpace::Flip() { 947 void NewSpace::Flip() {
949 SemiSpace tmp = from_space_; 948 SemiSpace tmp = from_space_;
950 from_space_ = to_space_; 949 from_space_ = to_space_;
951 to_space_ = tmp; 950 to_space_ = tmp;
952 } 951 }
953 952
954 953
955 bool NewSpace::Double() { 954 bool NewSpace::Grow() {
956 ASSERT(capacity_ <= maximum_capacity_ / 2); 955 ASSERT(Capacity() < MaximumCapacity());
957 // TODO(1240712): Failure to double the from space can result in 956 // TODO(1240712): Failure to double the from space can result in
958 // semispaces of different sizes. In the event of that failure, the 957 // semispaces of different sizes. In the event of that failure, the
959 // to space doubling should be rolled back before returning false. 958 // to space doubling should be rolled back before returning false.
960 if (!to_space_.Double() || !from_space_.Double()) return false; 959 if (!to_space_.Grow() || !from_space_.Grow()) return false;
961 capacity_ *= 2;
962 allocation_info_.limit = to_space_.high(); 960 allocation_info_.limit = to_space_.high();
963 ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); 961 ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
964 return true; 962 return true;
965 } 963 }
966 964
967 965
968 void NewSpace::ResetAllocationInfo() { 966 void NewSpace::ResetAllocationInfo() {
969 allocation_info_.top = to_space_.low(); 967 allocation_info_.top = to_space_.low();
970 allocation_info_.limit = to_space_.high(); 968 allocation_info_.limit = to_space_.high();
971 ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); 969 ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 return Commit(); 1071 return Commit();
1074 } 1072 }
1075 1073
1076 1074
1077 void SemiSpace::TearDown() { 1075 void SemiSpace::TearDown() {
1078 start_ = NULL; 1076 start_ = NULL;
1079 capacity_ = 0; 1077 capacity_ = 0;
1080 } 1078 }
1081 1079
1082 1080
1083 bool SemiSpace::Double() { 1081 bool SemiSpace::Grow() {
1084 if (!MemoryAllocator::CommitBlock(high(), capacity_, executable())) { 1082 // Commit 50% extra space but only up to maximum capacity.
1083 int maximum_extra = maximum_capacity_ - capacity_;
1084 int extra = Min(RoundUp(capacity_ / 2, OS::AllocateAlignment()),
1085 maximum_extra);
1086 if (!MemoryAllocator::CommitBlock(high(), extra, executable())) {
1085 return false; 1087 return false;
1086 } 1088 }
1087 capacity_ *= 2; 1089 capacity_ += extra;
1088 return true; 1090 return true;
1089 } 1091 }
1090 1092
1091 1093
1092 #ifdef DEBUG 1094 #ifdef DEBUG
1093 void SemiSpace::Print() { } 1095 void SemiSpace::Print() { }
1094 1096
1095 1097
1096 void SemiSpace::Verify() { } 1098 void SemiSpace::Verify() { }
1097 #endif 1099 #endif
(...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after
2599 reinterpret_cast<Object**>(object->address() 2601 reinterpret_cast<Object**>(object->address()
2600 + Page::kObjectAreaSize), 2602 + Page::kObjectAreaSize),
2601 allocation_top); 2603 allocation_top);
2602 PrintF("\n"); 2604 PrintF("\n");
2603 } 2605 }
2604 } 2606 }
2605 } 2607 }
2606 #endif // DEBUG 2608 #endif // DEBUG
2607 2609
2608 } } // namespace v8::internal 2610 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/spaces.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698