Chromium Code Reviews| Index: src/heap/mark-compact.cc |
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
| index 4032c55592e7130d19653bfb7751d560f225f0ca..449e2b63bd7ffb0cf48f7e3895dfce4d583e132a 100644 |
| --- a/src/heap/mark-compact.cc |
| +++ b/src/heap/mark-compact.cc |
| @@ -241,9 +241,6 @@ void MarkCompactCollector::SetUp() { |
| DCHECK(strcmp(Marking::kGreyBitPattern, "10") == 0); |
| DCHECK(strcmp(Marking::kImpossibleBitPattern, "01") == 0); |
| - free_list_old_space_.Reset(new FreeList(heap_->old_space())); |
| - free_list_code_space_.Reset(new FreeList(heap_->code_space())); |
| - free_list_map_space_.Reset(new FreeList(heap_->map_space())); |
| EnsureMarkingDequeIsReserved(); |
| EnsureMarkingDequeIsCommitted(kMinMarkingDequeSize); |
| @@ -475,9 +472,6 @@ class MarkCompactCollector::SweeperTask : public v8::Task { |
| void MarkCompactCollector::StartSweeperThreads() { |
| - DCHECK(free_list_old_space_.get()->IsEmpty()); |
| - DCHECK(free_list_code_space_.get()->IsEmpty()); |
| - DCHECK(free_list_map_space_.get()->IsEmpty()); |
| V8::GetCurrentPlatform()->CallOnBackgroundThread( |
| new SweeperTask(heap(), OLD_SPACE), v8::Platform::kShortRunningTask); |
| V8::GetCurrentPlatform()->CallOnBackgroundThread( |
| @@ -3312,28 +3306,12 @@ class EvacuationWeakObjectRetainer : public WeakObjectRetainer { |
| } |
| }; |
| - |
| enum SweepingMode { SWEEP_ONLY, SWEEP_AND_VISIT_LIVE_OBJECTS }; |
| - |
| enum SkipListRebuildingMode { REBUILD_SKIP_LIST, IGNORE_SKIP_LIST }; |
| - |
| enum FreeSpaceTreatmentMode { IGNORE_FREE_SPACE, ZAP_FREE_SPACE }; |
| - |
| -template <MarkCompactCollector::SweepingParallelism mode> |
| -static intptr_t Free(PagedSpace* space, FreeList* free_list, Address start, |
| - int size) { |
| - if (mode == MarkCompactCollector::SWEEP_ON_MAIN_THREAD) { |
| - DCHECK(free_list == NULL); |
| - return space->Free(start, size); |
| - } else { |
| - return size - free_list->Free(start, size); |
| - } |
| -} |
| - |
| - |
| // Sweeps a page. After sweeping the page can be iterated. |
| // Slots in live objects pointing into evacuation candidates are updated |
| // if requested. |
| @@ -3342,8 +3320,7 @@ template <SweepingMode sweeping_mode, |
| MarkCompactCollector::SweepingParallelism parallelism, |
| SkipListRebuildingMode skip_list_mode, |
| FreeSpaceTreatmentMode free_space_mode> |
| -static int Sweep(PagedSpace* space, FreeList* free_list, Page* p, |
| - ObjectVisitor* v) { |
| +static int Sweep(PagedSpace* space, Page* p, ObjectVisitor* v) { |
| DCHECK(!p->IsEvacuationCandidate() && !p->SweepingDone()); |
| DCHECK_EQ(skip_list_mode == REBUILD_SKIP_LIST, |
| space->identity() == CODE_SPACE); |
| @@ -3376,7 +3353,7 @@ static int Sweep(PagedSpace* space, FreeList* free_list, Page* p, |
| if (free_space_mode == ZAP_FREE_SPACE) { |
| memset(free_start, 0xcc, size); |
| } |
| - freed_bytes = Free<parallelism>(space, free_list, free_start, size); |
| + freed_bytes = space->UnaccountedFree(free_start, size, true); |
| max_freed_bytes = Max(freed_bytes, max_freed_bytes); |
| } |
| Map* map = object->synchronized_map(); |
| @@ -3404,7 +3381,7 @@ static int Sweep(PagedSpace* space, FreeList* free_list, Page* p, |
| if (free_space_mode == ZAP_FREE_SPACE) { |
| memset(free_start, 0xcc, size); |
| } |
| - freed_bytes = Free<parallelism>(space, free_list, free_start, size); |
| + freed_bytes = space->UnaccountedFree(free_start, size, true); |
| max_freed_bytes = Max(freed_bytes, max_freed_bytes); |
| } |
| p->concurrent_sweeping_state().SetValue(Page::kSweepingDone); |
| @@ -3516,24 +3493,29 @@ void MarkCompactCollector::SweepAbortedPages() { |
| p->ClearFlag(MemoryChunk::COMPACTION_WAS_ABORTED); |
| p->concurrent_sweeping_state().SetValue(Page::kSweepingInProgress); |
| PagedSpace* space = static_cast<PagedSpace*>(p->owner()); |
| + List<Page*>* pages = swept_pages(space->identity()); |
|
ulan
2016/03/09 15:03:57
Let's move it closer to the usage.
Michael Lippautz
2016/03/10 10:16:59
Done.
|
| switch (space->identity()) { |
| case OLD_SPACE: |
| Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, IGNORE_SKIP_LIST, |
| - IGNORE_FREE_SPACE>(space, nullptr, p, nullptr); |
| + IGNORE_FREE_SPACE>(space, p, nullptr); |
| break; |
| case CODE_SPACE: |
| if (FLAG_zap_code_space) { |
| Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, REBUILD_SKIP_LIST, |
| - ZAP_FREE_SPACE>(space, NULL, p, nullptr); |
| + ZAP_FREE_SPACE>(space, p, nullptr); |
| } else { |
| Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, REBUILD_SKIP_LIST, |
| - IGNORE_FREE_SPACE>(space, NULL, p, nullptr); |
| + IGNORE_FREE_SPACE>(space, p, nullptr); |
| } |
| break; |
| default: |
| UNREACHABLE(); |
| break; |
| } |
| + { |
| + base::LockGuard<base::Mutex> guard(&swept_pages_mutex_); |
| + pages->Add(p); |
| + } |
| } |
| } |
| } |
| @@ -3663,17 +3645,17 @@ void MarkCompactCollector::UpdatePointersAfterEvacuation() { |
| switch (space->identity()) { |
| case OLD_SPACE: |
| Sweep<SWEEP_AND_VISIT_LIVE_OBJECTS, SWEEP_ON_MAIN_THREAD, |
| - IGNORE_SKIP_LIST, IGNORE_FREE_SPACE>(space, NULL, p, |
| + IGNORE_SKIP_LIST, IGNORE_FREE_SPACE>(space, p, |
| &updating_visitor); |
| break; |
| case CODE_SPACE: |
| if (FLAG_zap_code_space) { |
| Sweep<SWEEP_AND_VISIT_LIVE_OBJECTS, SWEEP_ON_MAIN_THREAD, |
| - REBUILD_SKIP_LIST, ZAP_FREE_SPACE>(space, NULL, p, |
| + REBUILD_SKIP_LIST, ZAP_FREE_SPACE>(space, p, |
| &updating_visitor); |
| } else { |
| Sweep<SWEEP_AND_VISIT_LIVE_OBJECTS, SWEEP_ON_MAIN_THREAD, |
| - REBUILD_SKIP_LIST, IGNORE_FREE_SPACE>(space, NULL, p, |
| + REBUILD_SKIP_LIST, IGNORE_FREE_SPACE>(space, p, |
| &updating_visitor); |
| } |
| break; |
| @@ -3704,10 +3686,9 @@ void MarkCompactCollector::ReleaseEvacuationCandidates() { |
| for (Page* p : evacuation_candidates_) { |
| if (!p->IsEvacuationCandidate()) continue; |
| PagedSpace* space = static_cast<PagedSpace*>(p->owner()); |
| - space->Free(p->area_start(), p->area_size()); |
| p->ResetLiveBytes(); |
| CHECK(p->SweepingDone()); |
| - space->ReleasePage(p, true); |
| + space->ReleasePage(p); |
| } |
| evacuation_candidates_.Rewind(0); |
| compacting_ = false; |
| @@ -3746,25 +3727,21 @@ int MarkCompactCollector::SweepInParallel(Page* page, PagedSpace* space) { |
| return 0; |
| } |
| page->concurrent_sweeping_state().SetValue(Page::kSweepingInProgress); |
| - FreeList* free_list; |
| - FreeList private_free_list(space); |
| + List<Page*>* pages = swept_pages(space->identity()); |
|
ulan
2016/03/09 15:03:57
Let's move it closer to the usage.
Michael Lippautz
2016/03/10 10:16:59
Done.
|
| if (space->identity() == OLD_SPACE) { |
| - free_list = free_list_old_space_.get(); |
| - max_freed = |
| - Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST, |
| - IGNORE_FREE_SPACE>(space, &private_free_list, page, NULL); |
| + max_freed = Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST, |
| + IGNORE_FREE_SPACE>(space, page, NULL); |
| } else if (space->identity() == CODE_SPACE) { |
| - free_list = free_list_code_space_.get(); |
| - max_freed = |
| - Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, REBUILD_SKIP_LIST, |
| - IGNORE_FREE_SPACE>(space, &private_free_list, page, NULL); |
| + max_freed = Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, REBUILD_SKIP_LIST, |
| + IGNORE_FREE_SPACE>(space, page, NULL); |
| } else { |
| - free_list = free_list_map_space_.get(); |
| - max_freed = |
| - Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST, |
| - IGNORE_FREE_SPACE>(space, &private_free_list, page, NULL); |
| + max_freed = Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST, |
| + IGNORE_FREE_SPACE>(space, page, NULL); |
| + } |
| + { |
| + base::LockGuard<base::Mutex> guard(&swept_pages_mutex_); |
| + pages->Add(page); |
| } |
| - free_list->Concatenate(&private_free_list); |
| page->concurrent_sweeping_state().SetValue(Page::kSweepingDone); |
| page->mutex()->Unlock(); |
| } |
| @@ -3798,7 +3775,7 @@ void MarkCompactCollector::StartSweepSpace(PagedSpace* space) { |
| // testing this is fine. |
| p->concurrent_sweeping_state().SetValue(Page::kSweepingInProgress); |
| Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, IGNORE_SKIP_LIST, |
| - IGNORE_FREE_SPACE>(space, nullptr, p, nullptr); |
| + IGNORE_FREE_SPACE>(space, p, nullptr); |
| continue; |
| } |
| @@ -3808,7 +3785,7 @@ void MarkCompactCollector::StartSweepSpace(PagedSpace* space) { |
| if (FLAG_gc_verbose) { |
| PrintIsolate(isolate(), "sweeping: released page: %p", p); |
| } |
| - space->ReleasePage(p, false); |
| + space->ReleasePage(p); |
| continue; |
| } |
| unused_page_present = true; |