Chromium Code Reviews| Index: src/mark-compact.h |
| diff --git a/src/mark-compact.h b/src/mark-compact.h |
| index 2b9554ab0fd413a92dcf5001ef989a2aa07d1efd..9cabfed95c6fdaceb62cce284b17c3c89d3aae46 100644 |
| --- a/src/mark-compact.h |
| +++ b/src/mark-compact.h |
| @@ -256,6 +256,28 @@ class MarkingDeque { |
| }; |
| +class SlotsBuffer { |
| + public: |
| + typedef Object** ObjectSlot; |
| + |
| + SlotsBuffer(); |
| + ~SlotsBuffer(); |
| + |
| + void Clear(); |
| + void Add(ObjectSlot slot); |
| + void Iterate(ObjectVisitor* visitor); |
| + void Report(); |
| + private: |
|
Erik Corry
2011/06/20 20:41:26
missing blank line before private:
Vyacheslav Egorov (Chromium)
2011/06/21 11:44:48
Done.
|
| + static const int kBufferSize = 1024; |
| + |
| + List<ObjectSlot*> buffers_; |
| + ObjectSlot* buffer_; |
| + |
| + int idx_; |
| + int buffer_idx_; |
| +}; |
| + |
| + |
| // ------------------------------------------------------------------------- |
| // Mark-Compact collector |
| class MarkCompactCollector { |
| @@ -299,6 +321,10 @@ class MarkCompactCollector { |
| static void Initialize(); |
| + void CollectEvacuationCandidates(PagedSpace* space); |
| + |
| + void AddEvacuationCandidate(Page* p); |
| + |
| // Prepares for GC by resetting relocation info in old and map spaces and |
| // choosing spaces to compact. |
| void Prepare(GCTracer* tracer); |
| @@ -306,20 +332,6 @@ class MarkCompactCollector { |
| // Performs a global garbage collection. |
| void CollectGarbage(); |
| - // True if the last full GC performed heap compaction. |
| - bool HasCompacted() { return compacting_collection_; } |
| - |
| - // True after the Prepare phase if the compaction is taking place. |
| - bool IsCompacting() { |
| -#ifdef DEBUG |
| - // For the purposes of asserts we don't want this to keep returning true |
| - // after the collection is completed. |
| - return state_ != IDLE && compacting_collection_; |
| -#else |
| - return compacting_collection_; |
| -#endif |
| - } |
| - |
| // During a full GC, there is a stack-allocated GCTracer that is used for |
| // bookkeeping information. Return a pointer to that tracer. |
| GCTracer* tracer() { return tracer_; } |
| @@ -338,7 +350,7 @@ class MarkCompactCollector { |
| static const uint32_t kSingleFreeEncoding = 0; |
| static const uint32_t kMultiFreeEncoding = 1; |
| - inline bool IsMarked(Object* obj); |
| + static inline bool IsMarked(Object* obj); |
| inline Heap* heap() const { return heap_; } |
| @@ -356,6 +368,29 @@ class MarkCompactCollector { |
| // Return a number of reclaimed bytes. |
| static int SweepConservatively(PagedSpace* space, Page* p); |
| + INLINE(static bool IsOnEvacuationCandidateOrInNewSpace(Address anchor)) { |
| + return Page::FromAddress(anchor)->IsEvacuationCandidateOrNewSpace(); |
| + } |
| + |
| + INLINE(static bool IsOnEvacuationCandidate(Object* obj)) { |
| + return Page::FromAddress(reinterpret_cast<Address>(obj))-> |
| + IsEvacuationCandidate(); |
| + } |
| + |
| + INLINE(void RecordSlot(Address anchor, Object** slot, Object* object)) { |
| + if (IsOnEvacuationCandidate(object) && |
| + !IsOnEvacuationCandidateOrInNewSpace(anchor)) { |
| + slots_buffer_.Add(slot); |
| + } |
| + } |
| + |
| + void MigrateObject(Address dst, |
| + Address src, |
| + int size, |
| + AllocationSpace to_old_space); |
| + |
| + bool TryPromoteObject(HeapObject* object, int object_size); |
| + |
| private: |
| MarkCompactCollector(); |
| ~MarkCompactCollector(); |
| @@ -375,27 +410,16 @@ class MarkCompactCollector { |
| CollectorState state_; |
| #endif |
| - // Global flag that forces a compaction. |
| - bool force_compaction_; |
| - |
| // Global flag that forces sweeping to be precise, so we can traverse the |
| // heap. |
| bool sweep_precisely_; |
| - // Global flag indicating whether spaces were compacted on the last GC. |
| - bool compacting_collection_; |
| - |
| - // Global flag indicating whether spaces will be compacted on the next GC. |
| - bool compact_on_next_gc_; |
| - |
| - // The number of objects left marked at the end of the last completed full |
| - // GC (expected to be zero). |
| - int previous_marked_count_; |
| - |
| // A pointer to the current stack-allocated GC tracer object during a full |
| // collection (NULL before and after). |
| GCTracer* tracer_; |
| + SlotsBuffer slots_buffer_; |
| + |
| // Finishes GC, performs heap verification if enabled. |
| void Finish(); |
| @@ -481,9 +505,6 @@ class MarkCompactCollector { |
| void UpdateLiveObjectCount(HeapObject* obj); |
| #endif |
| - // Test whether a (possibly marked) object is a Map. |
| - static inline bool SafeIsMap(HeapObject* object); |
| - |
| // Map transitions from a live map to a dead map must be killed. |
| // We replace them with a null descriptor, with the same key. |
| void ClearNonLiveTransitions(); |
| @@ -516,8 +537,13 @@ class MarkCompactCollector { |
| // regions to each space's free list. |
| void SweepSpaces(); |
| - void SweepNewSpace(NewSpace* space); |
| + void EvacuateNewSpace(); |
| + |
| + void EvacuateLiveObjectsFromPage(Page* p); |
| + void EvacuatePages(); |
| + |
| + void EvacuateNewSpaceAndCandidates(); |
| void SweepSpace(PagedSpace* space, SweeperType sweeper); |
| @@ -563,6 +589,8 @@ class MarkCompactCollector { |
| MarkingDeque marking_deque_; |
| CodeFlusher* code_flusher_; |
| + List<Page*> evacuation_candidates_; |
| + |
| friend class Heap; |
| }; |