Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index e26653495ecf2ae7ff6bb9211798212dec8cbc1b..6fe7c4de8a38be2a7d1205916c41b680320ea4c0 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -608,6 +608,27 @@ void MarkCompactCollector::RefillFreeList(PagedSpace* space) { |
} |
+void MarkCompactCollector::RefillFreeList(CompactionSpace* space) { |
+ FreeList* free_list = nullptr; |
+ if (space->identity() == OLD_SPACE) { |
+ free_list = free_list_old_space_.get(); |
+ } else if (space->identity() == CODE_SPACE) { |
+ free_list = free_list_code_space_.get(); |
+ } else { |
+ UNREACHABLE(); |
+ } |
+ |
+ intptr_t refilled = 0; |
+ while (refilled < kCompactionSpaceMemoryWanted) { |
+ FreeSpace* node = |
+ free_list->TryRemoveMemory(kCompactionSpaceMemoryWanted - refilled); |
+ if (node == nullptr) return; |
+ refilled += node->size(); |
+ space->AddMemory(node->address(), node->size()); |
+ } |
+} |
+ |
+ |
void Marking::TransferMark(Heap* heap, Address old_start, Address new_start) { |
// This is only used when resizing an object. |
DCHECK(MemoryChunk::FromAddress(old_start) == |
@@ -3397,11 +3418,10 @@ void MarkCompactCollector::EvacuatePagesInParallel() { |
compaction_spaces_for_tasks[i] = new CompactionSpaceCollection(heap()); |
} |
- compaction_spaces_for_tasks[0]->Get(OLD_SPACE)->MoveOverFreeMemory( |
- heap()->old_space()); |
- compaction_spaces_for_tasks[0] |
- ->Get(CODE_SPACE) |
- ->MoveOverFreeMemory(heap()->code_space()); |
+ heap()->old_space()->DivideUponCompactionSpaces( |
+ compaction_spaces_for_tasks, num_tasks, kCompactionSpaceMemoryWanted); |
+ heap()->code_space()->DivideUponCompactionSpaces( |
+ compaction_spaces_for_tasks, num_tasks, kCompactionSpaceMemoryWanted); |
compaction_in_progress_ = true; |
// Kick off parallel tasks. |
@@ -3413,9 +3433,7 @@ void MarkCompactCollector::EvacuatePagesInParallel() { |
} |
// Contribute in main thread. Counter and signal are in principal not needed. |
- concurrent_compaction_tasks_active_++; |
EvacuatePages(compaction_spaces_for_tasks[0], &migration_slots_buffer_); |
- pending_compaction_tasks_semaphore_.Signal(); |
WaitUntilCompactionCompleted(); |