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

Unified Diff: src/heap/mark-compact.h

Issue 2828323004: [heap] Refactor MC and introduce MarkCompactCollectorBase (Closed)
Patch Set: More refactoring Created 3 years, 8 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
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/mark-compact.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/mark-compact.h
diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h
index 00620423fa689ef66d541c3ad5dcb6904e418916..71584379346808f0ca624e86175d88828604d600 100644
--- a/src/heap/mark-compact.h
+++ b/src/heap/mark-compact.h
@@ -17,20 +17,13 @@
namespace v8 {
namespace internal {
-// Callback function, returns whether an object is alive. The heap size
-// of the object is returned in size. It optionally updates the offset
-// to the first live object in the page (only used for old and map objects).
-typedef bool (*IsAliveFunction)(HeapObject* obj, int* size, int* offset);
-
-// Callback function to mark an object in a given heap.
-typedef void (*MarkObjectFunction)(Heap* heap, HeapObject* object);
-
// Forward declarations.
class CodeFlusher;
class HeapObjectVisitor;
class MarkCompactCollector;
class MinorMarkCompactCollector;
class MarkingVisitor;
+class ThreadLocalTop;
class ObjectMarking : public AllStatic {
public:
@@ -310,10 +303,6 @@ class CodeFlusher {
DISALLOW_COPY_AND_ASSIGN(CodeFlusher);
};
-
-// Defined in isolate.h.
-class ThreadLocalTop;
-
class MarkBitCellIterator BASE_EMBEDDED {
public:
MarkBitCellIterator(MemoryChunk* chunk, MarkingState state) : chunk_(chunk) {
@@ -422,41 +411,58 @@ class LiveObjectVisitor BASE_EMBEDDED {
enum PageEvacuationMode { NEW_TO_NEW, NEW_TO_OLD };
-class MinorMarkCompactCollector {
+// Base class for minor and full MC collectors.
+class MarkCompactCollectorBase {
public:
- explicit MinorMarkCompactCollector(Heap* heap)
- : heap_(heap), marking_deque_(heap) {}
+ virtual ~MarkCompactCollectorBase() {}
+ virtual void SetUp() = 0;
+ virtual void TearDown() = 0;
+ virtual void CollectGarbage() = 0;
- void SetUp();
- void TearDown();
+ inline Heap* heap() const { return heap_; }
+ inline Isolate* isolate() { return heap()->isolate(); }
- void CollectGarbage();
+ protected:
+ explicit MarkCompactCollectorBase(Heap* heap) : heap_(heap) {}
- inline Heap* heap() const { return heap_; }
+ virtual void MarkLiveObjects() = 0;
+
+ // The number of parallel compaction tasks, including the main thread.
+ int NumberOfParallelCompactionTasks(int pages, intptr_t live_bytes);
+
+ Heap* heap_;
+};
+
+// Collector for young-generation only.
+class MinorMarkCompactCollector final : public MarkCompactCollectorBase {
+ public:
+ explicit MinorMarkCompactCollector(Heap* heap)
+ : MarkCompactCollectorBase(heap), marking_deque_(heap) {}
+
+ void SetUp() override;
+ void TearDown() override;
+ void CollectGarbage() override;
private:
class RootMarkingVisitor;
- inline Isolate* isolate() { return heap()->isolate(); }
inline MarkingDeque* marking_deque() { return &marking_deque_; }
V8_INLINE void MarkObject(HeapObject* obj);
V8_INLINE void PushBlack(HeapObject* obj);
SlotCallbackResult CheckAndMarkObject(Heap* heap, Address slot_address);
- void MarkLiveObjects();
+ void MarkLiveObjects() override;
void ProcessMarkingDeque();
void EmptyMarkingDeque();
- Heap* heap_;
MarkingDeque marking_deque_;
friend class StaticYoungGenerationMarkingVisitor;
};
-// -------------------------------------------------------------------------
-// Mark-Compact collector
-class MarkCompactCollector {
+// Collector for young and old generation.
+class MarkCompactCollector final : public MarkCompactCollectorBase {
public:
class RootMarkingVisitor;
@@ -543,12 +549,10 @@ class MarkCompactCollector {
static void Initialize();
- static SlotCallbackResult CheckAndMarkObject(Heap* heap,
- Address slot_address);
-
- void SetUp();
-
- void TearDown();
+ void SetUp() override;
+ void TearDown() override;
+ // Performs a global garbage collection.
+ void CollectGarbage() override;
void CollectEvacuationCandidates(PagedSpace* space);
@@ -558,9 +562,6 @@ class MarkCompactCollector {
// choosing spaces to compact.
void Prepare();
- // Performs a global garbage collection.
- void CollectGarbage();
-
bool StartCompaction();
void AbortCompaction();
@@ -573,7 +574,6 @@ class MarkCompactCollector {
static const uint32_t kSingleFreeEncoding = 0;
static const uint32_t kMultiFreeEncoding = 1;
- inline Heap* heap() const { return heap_; }
inline Isolate* isolate() const;
CodeFlusher* code_flusher() { return code_flusher_; }
@@ -659,23 +659,6 @@ class MarkCompactCollector {
// Finishes GC, performs heap verification if enabled.
void Finish();
- // -----------------------------------------------------------------------
- // Phase 1: Marking live objects.
- //
- // Before: The heap has been prepared for garbage collection by
- // MarkCompactCollector::Prepare() and is otherwise in its
- // normal state.
- //
- // After: Live objects are marked and non-live objects are unmarked.
-
- friend class CodeMarkingVisitor;
- friend class IncrementalMarkingMarkingVisitor;
- friend class MarkCompactMarkingVisitor;
- friend class MarkingVisitor;
- friend class RecordMigratedSlotVisitor;
- friend class SharedFunctionInfoMarkingVisitor;
- friend class StaticYoungGenerationMarkingVisitor;
-
// Mark code objects that are active on the stack to prevent them
// from being flushed.
void PrepareThreadForCodeFlushing(Isolate* isolate, ThreadLocalTop* top);
@@ -683,7 +666,7 @@ class MarkCompactCollector {
void PrepareForCodeFlushing();
// Marking operations for objects reachable from roots.
- void MarkLiveObjects();
+ void MarkLiveObjects() override;
// Pushes a black object onto the marking stack and accounts for live bytes.
// Note that this assumes live bytes have not yet been counted.
@@ -793,26 +776,12 @@ class MarkCompactCollector {
void EvacuateEpilogue();
void EvacuatePagesInParallel();
- // The number of parallel compaction tasks, including the main thread.
- int NumberOfParallelCompactionTasks(int pages, intptr_t live_bytes);
-
void EvacuateNewSpaceAndCandidates();
void UpdatePointersAfterEvacuation();
void ReleaseEvacuationCandidates();
-
-#ifdef DEBUG
- friend class MarkObjectVisitor;
- static void VisitObject(HeapObject* obj);
-
- friend class UnmarkObjectVisitor;
- static void UnmarkObject(HeapObject* obj);
-#endif
-
- Heap* heap_;
-
base::Semaphore page_parallel_job_semaphore_;
#ifdef DEBUG
@@ -854,11 +823,17 @@ class MarkCompactCollector {
Sweeper sweeper_;
+ friend class CodeMarkingVisitor;
friend class Heap;
+ friend class IncrementalMarkingMarkingVisitor;
+ friend class MarkCompactMarkingVisitor;
+ friend class MarkingVisitor;
+ friend class RecordMigratedSlotVisitor;
+ friend class SharedFunctionInfoMarkingVisitor;
+ friend class StaticYoungGenerationMarkingVisitor;
friend class StoreBuffer;
};
-
class EvacuationScope BASE_EMBEDDED {
public:
explicit EvacuationScope(MarkCompactCollector* collector)
@@ -872,7 +847,6 @@ class EvacuationScope BASE_EMBEDDED {
MarkCompactCollector* collector_;
};
-V8_EXPORT_PRIVATE const char* AllocationSpaceName(AllocationSpace space);
} // namespace internal
} // namespace v8
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698