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

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

Issue 2840863002: [heap] MC: Refactor page evacuation (Closed)
Patch Set: 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
« src/heap/mark-compact.h ('K') | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/mark-compact.cc
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
index 468a0e8bfdd57a0399c749cf9fa677f36b272672..7c5dd8b5d78799ac2f2fc0ff2b10b25fe9f44e7c 100644
--- a/src/heap/mark-compact.cc
+++ b/src/heap/mark-compact.cc
@@ -3204,7 +3204,7 @@ class Evacuator : public Malloced {
virtual ~Evacuator() {}
- bool EvacuatePage(Page* page, const MarkingState& state);
+ bool EvacuatePage(Page* page);
// Merge back locally cached info sequentially. Note that this method needs
// to be called from the main thread.
@@ -3216,7 +3216,8 @@ class Evacuator : public Malloced {
protected:
static const int kInitialLocalPretenuringFeedbackCapacity = 256;
- virtual bool RawEvacuatePage(Page* page, const MarkingState& state) = 0;
+ // |saved_live_bytes| returns the live bytes of the page that was processed.
+ virtual bool RawEvacuatePage(Page* page, intptr_t* saved_live_bytes) = 0;
inline Heap* heap() { return heap_; }
@@ -3244,15 +3245,15 @@ class Evacuator : public Malloced {
intptr_t bytes_compacted_;
};
-bool Evacuator::EvacuatePage(Page* page, const MarkingState& state) {
+bool Evacuator::EvacuatePage(Page* page) {
bool success = false;
DCHECK(page->SweepingDone());
- intptr_t saved_live_bytes = state.live_bytes();
+ intptr_t saved_live_bytes = 0;
double evacuation_time = 0.0;
{
AlwaysAllocateScope always_allocate(heap()->isolate());
TimedScope timed_scope(&evacuation_time);
- success = RawEvacuatePage(page, state);
+ success = RawEvacuatePage(page, &saved_live_bytes);
}
ReportCompactionProgress(evacuation_time, saved_live_bytes);
if (FLAG_trace_evacuation) {
@@ -3292,16 +3293,21 @@ void Evacuator::Finalize() {
class FullEvacuator : public Evacuator {
public:
- FullEvacuator(Heap* heap, RecordMigratedSlotVisitor* record_visitor)
- : Evacuator(heap, record_visitor) {}
+ FullEvacuator(MarkCompactCollector* collector,
+ RecordMigratedSlotVisitor* record_visitor)
+ : Evacuator(collector->heap(), record_visitor), collector_(collector) {}
protected:
- bool RawEvacuatePage(Page* page, const MarkingState& state) override;
+ bool RawEvacuatePage(Page* page, intptr_t* live_bytes) override;
+
+ MarkCompactCollector* collector_;
};
-bool FullEvacuator::RawEvacuatePage(Page* page, const MarkingState& state) {
+bool FullEvacuator::RawEvacuatePage(Page* page, intptr_t* live_bytes) {
bool success = false;
LiveObjectVisitor object_visitor;
+ const MarkingState state = collector_->marking_state(page);
+ *live_bytes = state.live_bytes();
switch (ComputeEvacuationMode(page)) {
case kObjectsNewToOld:
success = object_visitor.VisitBlackObjects(
@@ -3315,8 +3321,7 @@ bool FullEvacuator::RawEvacuatePage(Page* page, const MarkingState& state) {
page, state, &new_to_old_page_visitor_,
LiveObjectVisitor::kKeepMarking);
DCHECK(success);
- new_to_old_page_visitor_.account_moved_bytes(
- MarkingState::Internal(page).live_bytes());
+ new_to_old_page_visitor_.account_moved_bytes(state.live_bytes());
// ArrayBufferTracker will be updated during sweeping.
break;
case kPageNewToNew:
@@ -3324,8 +3329,7 @@ bool FullEvacuator::RawEvacuatePage(Page* page, const MarkingState& state) {
page, state, &new_to_new_page_visitor_,
LiveObjectVisitor::kKeepMarking);
DCHECK(success);
- new_to_new_page_visitor_.account_moved_bytes(
- MarkingState::Internal(page).live_bytes());
+ new_to_new_page_visitor_.account_moved_bytes(state.live_bytes());
// ArrayBufferTracker will be updated during sweeping.
break;
case kObjectsOldToOld:
@@ -3364,8 +3368,7 @@ class EvacuationJobTraits {
static bool ProcessPageInParallel(Heap* heap, PerTaskData evacuator,
MemoryChunk* chunk, PerPageData) {
- return evacuator->EvacuatePage(reinterpret_cast<Page*>(chunk),
- MarkingState::Internal(chunk));
+ return evacuator->EvacuatePage(reinterpret_cast<Page*>(chunk));
}
static void FinalizePageSequentially(Heap* heap, MemoryChunk* chunk,
@@ -3443,7 +3446,7 @@ void MarkCompactCollector::EvacuatePagesInParallel() {
FullEvacuator** evacuators = new FullEvacuator*[wanted_num_tasks];
RecordMigratedSlotVisitor record_visitor(this);
for (int i = 0; i < wanted_num_tasks; i++) {
- evacuators[i] = new FullEvacuator(heap(), &record_visitor);
+ evacuators[i] = new FullEvacuator(this, &record_visitor);
}
job.Run(wanted_num_tasks, [evacuators](int i) { return evacuators[i]; });
const Address top = heap()->new_space()->top();
« src/heap/mark-compact.h ('K') | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698