Index: src/spaces.h |
diff --git a/src/spaces.h b/src/spaces.h |
index 5b47c34b895b82dfaffa3c24a18101c3b92190fd..0f4bd3ee44fb65fb3d19fe5487f3a0076d8484d1 100644 |
--- a/src/spaces.h |
+++ b/src/spaces.h |
@@ -392,9 +392,24 @@ class MemoryChunk { |
NEW_SPACE_BELOW_AGE_MARK, |
CONTAINS_ONLY_DATA, |
EVACUATION_CANDIDATE, |
+ EVACUATED, |
NUM_MEMORY_CHUNK_FLAGS |
}; |
+ |
+ static const int kPointersToHereAreInterestingMask = |
+ 1 << POINTERS_TO_HERE_ARE_INTERESTING; |
+ |
+ static const int kPointersFromHereAreInterestingMask = |
+ 1 << POINTERS_FROM_HERE_ARE_INTERESTING; |
+ |
+ static const int kEvacuationCandidateMask = |
+ 1 << EVACUATION_CANDIDATE; |
+ |
+ static const int kEvacuationCandidateOrNewSpaceMask = |
+ (1 << EVACUATION_CANDIDATE) | (1 << IN_FROM_SPACE) | (1 << IN_TO_SPACE); |
+ |
+ |
void SetFlag(int flag) { |
flags_ |= (1 << flag); |
} |
@@ -609,16 +624,19 @@ class Page : public MemoryChunk { |
bool IsEvacuationCandidate() { return IsFlagSet(EVACUATION_CANDIDATE); } |
bool IsEvacuationCandidateOrNewSpace() { |
- intptr_t mask = (1 << EVACUATION_CANDIDATE) | |
- (1 << IN_FROM_SPACE) | |
- (1 << IN_TO_SPACE); |
- return (flags_ & mask) != 0; |
+ return (flags_ & kEvacuationCandidateOrNewSpaceMask) != 0; |
} |
void MarkEvacuationCandidate() { SetFlag(EVACUATION_CANDIDATE); } |
void ClearEvacuationCandidate() { ClearFlag(EVACUATION_CANDIDATE); } |
+ bool WasEvacuated() { return IsFlagSet(EVACUATED); } |
+ |
+ void MarkEvacuated() { SetFlag(EVACUATED); } |
+ |
+ void ClearEvacuated() { ClearFlag(EVACUATED); } |
+ |
friend class MemoryAllocator; |
}; |
@@ -1035,6 +1053,9 @@ class PageIterator BASE_EMBEDDED { |
// space. |
class AllocationInfo { |
public: |
+ AllocationInfo() : top(NULL), limit(NULL) { |
+ } |
+ |
Address top; // Current allocation top. |
Address limit; // Current allocation limit. |
@@ -1228,6 +1249,10 @@ class FreeList BASE_EMBEDDED { |
static const int kMinBlockSize = 3 * kPointerSize; |
static const int kMaxBlockSize = Page::kMaxHeapObjectSize; |
+ FreeListNode* PickNodeFromList(FreeListNode** list, int* node_size); |
+ |
+ FreeListNode* FindNodeFor(int size_in_bytes, int* node_size); |
+ |
PagedSpace* owner_; |
Heap* heap_; |
@@ -1423,7 +1448,6 @@ class PagedSpace : public Space { |
Page* FirstPage() { return anchor_.next_page(); } |
Page* LastPage() { return anchor_.prev_page(); } |
- |
bool IsFragmented(Page* p) { |
intptr_t sizes[4]; |
free_list_.CountFreeListItems(p, sizes); |
@@ -1448,6 +1472,8 @@ class PagedSpace : public Space { |
return ratio > 15; |
} |
+ void EvictEvacuationCandidatesFromFreeLists(); |
+ |
protected: |
// Maximum capacity of this space. |
intptr_t max_capacity_; |
@@ -2180,10 +2206,6 @@ class OldSpace : public PagedSpace { |
return page->ObjectAreaEnd(); |
} |
- // Prepare for full garbage collection. Resets the relocation pointer and |
- // clears the free list. |
- virtual void PrepareForMarkCompact(); |
- |
public: |
TRACK_MEMORY("OldSpace") |
}; |