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

Unified Diff: src/spaces.cc

Issue 7189066: Simple non-incremental compaction by evacuation. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: Created 9 years, 6 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
Index: src/spaces.cc
diff --git a/src/spaces.cc b/src/spaces.cc
index bfeb522570de26e6062c479a060ec60686dbefbc..0e38c9fd58a66893e074b461c1f49b7d78217100 100644
--- a/src/spaces.cc
+++ b/src/spaces.cc
@@ -1673,13 +1673,13 @@ void FreeListNode::set_next(FreeListNode* next) {
}
-OldSpaceFreeList::OldSpaceFreeList(PagedSpace* owner)
+FreeList::FreeList(PagedSpace* owner)
: owner_(owner), heap_(owner->heap()) {
Reset();
}
-void OldSpaceFreeList::Reset() {
+void FreeList::Reset() {
available_ = 0;
small_list_ = NULL;
medium_list_ = NULL;
@@ -1688,7 +1688,7 @@ void OldSpaceFreeList::Reset() {
}
-int OldSpaceFreeList::Free(Address start, int size_in_bytes) {
+int FreeList::Free(Address start, int size_in_bytes) {
if (size_in_bytes == 0) return 0;
FreeListNode* node = FreeListNode::FromAddress(start);
node->set_size(heap_, size_in_bytes);
@@ -1721,7 +1721,7 @@ int OldSpaceFreeList::Free(Address start, int size_in_bytes) {
// allocation space has been set up with the top and limit of the space. If
// the allocation fails then NULL is returned, and the caller can perform a GC
// or allocate a new page before retrying.
-HeapObject* OldSpaceFreeList::Allocate(int size_in_bytes) {
+HeapObject* FreeList::Allocate(int size_in_bytes) {
ASSERT(0 < size_in_bytes);
ASSERT(size_in_bytes <= kMaxBlockSize);
ASSERT(IsAligned(size_in_bytes, kPointerSize));
@@ -1802,8 +1802,28 @@ HeapObject* OldSpaceFreeList::Allocate(int size_in_bytes) {
}
+static intptr_t CountFreeListItemsInList(FreeListNode* n, Page* p) {
+ intptr_t sum = 0;
+ while (n != NULL) {
+ if (Page::FromAddress(n->address()) == p) {
+ FreeSpace* free_space = reinterpret_cast<FreeSpace*>(n);
+ sum += free_space->Size();
+ }
+ n = n->next();
+ }
+ return sum;
+}
+
+
+void FreeList::CountFreeListItems(Page* p, intptr_t* sizes) {
+ sizes[0] = CountFreeListItemsInList(small_list_, p);
+ sizes[1] = CountFreeListItemsInList(medium_list_, p);
+ sizes[2] = CountFreeListItemsInList(large_list_, p);
+ sizes[3] = CountFreeListItemsInList(huge_list_, p);
+}
+
#ifdef DEBUG
-intptr_t OldSpaceFreeList::SumFreeList(FreeListNode* cur) {
+intptr_t FreeList::SumFreeList(FreeListNode* cur) {
intptr_t sum = 0;
while (cur != NULL) {
ASSERT(cur->map() == HEAP->raw_unchecked_free_space_map());
@@ -1818,7 +1838,7 @@ intptr_t OldSpaceFreeList::SumFreeList(FreeListNode* cur) {
static const int kVeryLongFreeList = 500;
-int OldSpaceFreeList::FreeListLength(FreeListNode* cur) {
+int FreeList::FreeListLength(FreeListNode* cur) {
int length = 0;
while (cur != NULL) {
length++;
@@ -1829,7 +1849,7 @@ int OldSpaceFreeList::FreeListLength(FreeListNode* cur) {
}
-bool OldSpaceFreeList::IsVeryLong() {
+bool FreeList::IsVeryLong() {
if (FreeListLength(small_list_) == kVeryLongFreeList) return true;
if (FreeListLength(medium_list_) == kVeryLongFreeList) return true;
if (FreeListLength(large_list_) == kVeryLongFreeList) return true;
@@ -1841,7 +1861,7 @@ bool OldSpaceFreeList::IsVeryLong() {
// This can take a very long time because it is linear in the number of entries
// on the free list, so it should not be called if FreeListLength returns
// kVeryLongFreeList.
-intptr_t OldSpaceFreeList::SumFreeLists() {
+intptr_t FreeList::SumFreeLists() {
intptr_t sum = SumFreeList(small_list_);
sum += SumFreeList(medium_list_);
sum += SumFreeList(large_list_);
@@ -1854,15 +1874,14 @@ intptr_t OldSpaceFreeList::SumFreeLists() {
// -----------------------------------------------------------------------------
// OldSpace implementation
-void OldSpace::PrepareForMarkCompact(bool will_compact) {
- ASSERT(!will_compact);
+void OldSpace::PrepareForMarkCompact() {
// Call prepare of the super class.
- PagedSpace::PrepareForMarkCompact(will_compact);
+ PagedSpace::PrepareForMarkCompact();
+ // Stop lazy sweeping for this space.
first_unswept_page_ = last_unswept_page_ = Page::FromAddress(NULL);
// Clear the free list before a full GC---it will be rebuilt afterward.
- // TODO(gc): can we avoid resetting free list?
free_list_.Reset();
}
@@ -1877,8 +1896,7 @@ bool NewSpace::ReserveSpace(int bytes) {
}
-void PagedSpace::PrepareForMarkCompact(bool will_compact) {
- ASSERT(!will_compact);
+void PagedSpace::PrepareForMarkCompact() {
// We don't have a linear allocation area while sweeping. It will be restored
// on the first allocation after the sweep.
// Mark the old linear allocation area with a free space map so it can be
@@ -2126,11 +2144,9 @@ void PagedSpace::ReportStatistics() {
// -----------------------------------------------------------------------------
// FixedSpace implementation
-void FixedSpace::PrepareForMarkCompact(bool will_compact) {
+void FixedSpace::PrepareForMarkCompact() {
// Call prepare of the super class.
- PagedSpace::PrepareForMarkCompact(will_compact);
-
- ASSERT(!will_compact);
+ PagedSpace::PrepareForMarkCompact();
// During a non-compacting collection, everything below the linear
// allocation pointer except wasted top-of-page blocks is considered
@@ -2146,12 +2162,6 @@ void FixedSpace::PrepareForMarkCompact(bool will_compact) {
// -----------------------------------------------------------------------------
// MapSpace implementation
-void MapSpace::PrepareForMarkCompact(bool will_compact) {
- // Call prepare of the super class.
- FixedSpace::PrepareForMarkCompact(will_compact);
-}
-
-
#ifdef DEBUG
void MapSpace::VerifyObject(HeapObject* object) {
// The object should be a map or a free-list node.
@@ -2337,7 +2347,6 @@ void LargeObjectSpace::FreeUnmarkedObjects() {
MarkBit mark_bit = Marking::MarkBitFrom(object);
if (mark_bit.Get()) {
mark_bit.Clear();
- heap()->mark_compact_collector()->tracer()->decrement_marked_count();
previous = current;
current = current->next_page();
} else {

Powered by Google App Engine
This is Rietveld 408576698