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

Unified Diff: src/spaces.cc

Issue 7619: - Removed a few indirections by making the two SemiSpaces... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 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 side-by-side diff with in-line comments
Download patch
« src/spaces.h ('K') | « src/spaces.h ('k') | src/spaces-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/spaces.cc
===================================================================
--- src/spaces.cc (revision 516)
+++ src/spaces.cc (working copy)
@@ -36,9 +36,9 @@
// For contiguous spaces, top should be in the space (or at the end) and limit
// should be the end of the space.
#define ASSERT_SEMISPACE_ALLOCATION_INFO(info, space) \
- ASSERT((space)->low() <= (info).top \
- && (info).top <= (space)->high() \
- && (info).limit == (space)->high())
+ ASSERT((space).low() <= (info).top \
+ && (info).top <= (space).high() \
+ && (info).limit == (space).high())
// ----------------------------------------------------------------------------
@@ -760,16 +760,21 @@
// -----------------------------------------------------------------------------
// NewSpace implementation
-NewSpace::NewSpace(int initial_semispace_capacity,
- int maximum_semispace_capacity,
- AllocationSpace id)
- : Space(id, NOT_EXECUTABLE) {
+
+bool NewSpace::Setup(Address start, int size) {
+ // Create a new space with a given allocation capacity (ie, the capacity of
Kevin Millikin (Chromium) 2008/10/17 09:02:41 The comment is confusing because the capacity is n
+ // *one* of the semispaces). The constructor does not allocate heap memory
+ // from the OS. When the space is set up, it is given a contiguous chunk of
+ // memory of size 2 * semispace_capacity. To support fast containment
+ // testing in the new space, the size of this chunk must be a power of two
+ // and it must be aligned to its size.
+ int initial_semispace_capacity = Heap::InitialSemiSpaceSize();
+ int maximum_semispace_capacity = Heap::SemiSpaceSize();
+
ASSERT(initial_semispace_capacity <= maximum_semispace_capacity);
ASSERT(IsPowerOf2(maximum_semispace_capacity));
maximum_capacity_ = maximum_semispace_capacity;
capacity_ = initial_semispace_capacity;
- to_space_ = new SemiSpace(capacity_, maximum_capacity_, id);
- from_space_ = new SemiSpace(capacity_, maximum_capacity_, id);
// Allocate and setup the histogram arrays if necessary.
#if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING)
@@ -781,19 +786,15 @@
INSTANCE_TYPE_LIST(SET_NAME)
#undef SET_NAME
#endif
-}
-bool NewSpace::Setup(Address start, int size) {
ASSERT(size == 2 * maximum_capacity_);
ASSERT(IsAddressAligned(start, size, 0));
- if (to_space_ == NULL
- || !to_space_->Setup(start, maximum_capacity_)) {
+ if (!to_space_.Setup(start, capacity_, maximum_capacity_)) {
return false;
}
- if (from_space_ == NULL
- || !from_space_->Setup(start + maximum_capacity_, maximum_capacity_)) {
+ if (!from_space_.Setup(start + maximum_capacity_, capacity_, maximum_capacity_)) {
return false;
}
@@ -802,8 +803,8 @@
object_mask_ = address_mask_ | kHeapObjectTag;
object_expected_ = reinterpret_cast<uint32_t>(start) | kHeapObjectTag;
- allocation_info_.top = to_space_->low();
- allocation_info_.limit = to_space_->high();
+ allocation_info_.top = to_space_.low();
+ allocation_info_.limit = to_space_.high();
mc_forwarding_info_.top = NULL;
mc_forwarding_info_.limit = NULL;
@@ -831,22 +832,13 @@
mc_forwarding_info_.top = NULL;
mc_forwarding_info_.limit = NULL;
- if (to_space_ != NULL) {
- to_space_->TearDown();
- delete to_space_;
- to_space_ = NULL;
- }
-
- if (from_space_ != NULL) {
- from_space_->TearDown();
- delete from_space_;
- from_space_ = NULL;
- }
+ to_space_.TearDown();
+ from_space_.TearDown();
}
void NewSpace::Flip() {
- SemiSpace* tmp = from_space_;
+ SemiSpace tmp = from_space_;
from_space_ = to_space_;
to_space_ = tmp;
}
@@ -857,24 +849,24 @@
// TODO(1240712): Failure to double the from space can result in
// semispaces of different sizes. In the event of that failure, the
// to space doubling should be rolled back before returning false.
- if (!to_space_->Double() || !from_space_->Double()) return false;
+ if (!to_space_.Double() || !from_space_.Double()) return false;
capacity_ *= 2;
- allocation_info_.limit = to_space_->high();
+ allocation_info_.limit = to_space_.high();
ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
return true;
}
void NewSpace::ResetAllocationInfo() {
- allocation_info_.top = to_space_->low();
- allocation_info_.limit = to_space_->high();
+ allocation_info_.top = to_space_.low();
+ allocation_info_.limit = to_space_.high();
ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
}
void NewSpace::MCResetRelocationInfo() {
- mc_forwarding_info_.top = from_space_->low();
- mc_forwarding_info_.limit = from_space_->high();
+ mc_forwarding_info_.top = from_space_.low();
+ mc_forwarding_info_.limit = from_space_.high();
ASSERT_SEMISPACE_ALLOCATION_INFO(mc_forwarding_info_, from_space_);
}
@@ -883,7 +875,7 @@
// Assumes that the spaces have been flipped so that mc_forwarding_info_ is
// valid allocation info for the to space.
allocation_info_.top = mc_forwarding_info_.top;
- allocation_info_.limit = to_space_->high();
+ allocation_info_.limit = to_space_.high();
ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
}
@@ -897,7 +889,7 @@
// There should be objects packed in from the low address up to the
// allocation pointer.
- Address current = to_space_->low();
+ Address current = to_space_.low();
while (current < top()) {
HeapObject* object = HeapObject::FromAddress(current);
@@ -931,22 +923,20 @@
// -----------------------------------------------------------------------------
// SemiSpace implementation
-SemiSpace::SemiSpace(int initial_capacity,
- int maximum_capacity,
- AllocationSpace id)
- : Space(id, NOT_EXECUTABLE), capacity_(initial_capacity),
- maximum_capacity_(maximum_capacity), start_(NULL), age_mark_(NULL) {
-}
+bool SemiSpace::Setup(Address start, int initial_capacity, int maximum_capacity) {
+ // Creates a space in the young generation. The constructor does not
+ // allocate memory from the OS. A SemiSpace is given a contiguous chunk of
+ // memory of size 'capacity' when set up, and does not grow or shrink
+ // otherwise. In the mark-compact collector, the memory region of the from
+ // space is used as the marking stack. It requires contiguous memory
+ // addresses.
+ capacity_ = initial_capacity;
+ maximum_capacity_ = maximum_capacity;
+ if (!MemoryAllocator::CommitBlock(start, capacity_, executable())) return false;
-bool SemiSpace::Setup(Address start, int size) {
- ASSERT(size == maximum_capacity_);
- if (!MemoryAllocator::CommitBlock(start, capacity_, executable())) {
- return false;
- }
-
start_ = start;
- address_mask_ = ~(size - 1);
+ address_mask_ = ~(maximum_capacity - 1);
object_mask_ = address_mask_ | kHeapObjectTag;
object_expected_ = reinterpret_cast<uint32_t>(start) | kHeapObjectTag;
@@ -1002,7 +992,7 @@
ASSERT(space->ToSpaceContains(start));
ASSERT(space->ToSpaceLow() <= end
&& end <= space->ToSpaceHigh());
- space_ = space->to_space_;
+ space_ = &space->to_space_;
current_ = start;
limit_ = end;
size_func_ = size_func;
« src/spaces.h ('K') | « src/spaces.h ('k') | src/spaces-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698