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

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

Issue 2124433002: [heap] Clean up RawSweep (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comment Created 4 years, 5 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/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 07a4ac49d88443b2073d43c53535c103595adc36..51d114a7ab047da667134fae6de4907d2f8d34f1 100644
--- a/src/heap/mark-compact.cc
+++ b/src/heap/mark-compact.cc
@@ -3380,19 +3380,15 @@ class EvacuationWeakObjectRetainer : public WeakObjectRetainer {
}
};
-template <MarkCompactCollector::Sweeper::SweepingMode sweeping_mode,
- MarkCompactCollector::Sweeper::SweepingParallelism parallelism,
- MarkCompactCollector::Sweeper::SkipListRebuildingMode skip_list_mode,
- MarkCompactCollector::Sweeper::FreeListRebuildingMode free_list_mode,
- MarkCompactCollector::Sweeper::FreeSpaceTreatmentMode free_space_mode>
-int MarkCompactCollector::Sweeper::RawSweep(PagedSpace* space, Page* p,
- ObjectVisitor* v) {
+int MarkCompactCollector::Sweeper::RawSweep(
+ Page* p, FreeListRebuildingMode free_list_mode,
+ FreeSpaceTreatmentMode free_space_mode) {
+ Space* space = p->owner();
+ DCHECK_NOT_NULL(space);
+ DCHECK(free_list_mode == IGNORE_FREE_LIST || space->identity() == OLD_SPACE ||
+ space->identity() == CODE_SPACE || space->identity() == MAP_SPACE);
DCHECK(!p->IsEvacuationCandidate() && !p->SweepingDone());
DCHECK(!p->IsFlagSet(Page::BLACK_PAGE));
- DCHECK((space == nullptr) || (space->identity() != CODE_SPACE) ||
- (skip_list_mode == REBUILD_SKIP_LIST));
- DCHECK((p->skip_list() == NULL) || (skip_list_mode == REBUILD_SKIP_LIST));
- DCHECK(parallelism == SWEEP_ON_MAIN_THREAD || sweeping_mode == SWEEP_ONLY);
// Before we sweep objects on the page, we free dead array buffers which
// requires valid mark bits.
@@ -3404,8 +3400,10 @@ int MarkCompactCollector::Sweeper::RawSweep(PagedSpace* space, Page* p,
// If we use the skip list for code space pages, we have to lock the skip
// list because it could be accessed concurrently by the runtime or the
// deoptimizer.
+ const bool rebuild_skip_list =
+ space->identity() == CODE_SPACE && p->skip_list() != nullptr;
SkipList* skip_list = p->skip_list();
- if ((skip_list_mode == REBUILD_SKIP_LIST) && skip_list) {
+ if (rebuild_skip_list) {
skip_list->Clear();
}
@@ -3424,7 +3422,8 @@ int MarkCompactCollector::Sweeper::RawSweep(PagedSpace* space, Page* p,
memset(free_start, 0xcc, size);
}
if (free_list_mode == REBUILD_FREE_LIST) {
- freed_bytes = space->UnaccountedFree(free_start, size);
+ freed_bytes = reinterpret_cast<PagedSpace*>(space)->UnaccountedFree(
+ free_start, size);
max_freed_bytes = Max(freed_bytes, max_freed_bytes);
} else {
p->heap()->CreateFillerObjectAt(free_start, size,
@@ -3433,10 +3432,7 @@ int MarkCompactCollector::Sweeper::RawSweep(PagedSpace* space, Page* p,
}
Map* map = object->synchronized_map();
int size = object->SizeFromMap(map);
- if (sweeping_mode == SWEEP_AND_VISIT_LIVE_OBJECTS) {
- object->IterateBody(map->instance_type(), size, v);
- }
- if ((skip_list_mode == REBUILD_SKIP_LIST) && skip_list != NULL) {
+ if (rebuild_skip_list) {
int new_region_start = SkipList::RegionNumber(free_end);
int new_region_end =
SkipList::RegionNumber(free_end + size - kPointerSize);
@@ -3457,7 +3453,8 @@ int MarkCompactCollector::Sweeper::RawSweep(PagedSpace* space, Page* p,
memset(free_start, 0xcc, size);
}
if (free_list_mode == REBUILD_FREE_LIST) {
- freed_bytes = space->UnaccountedFree(free_start, size);
+ freed_bytes = reinterpret_cast<PagedSpace*>(space)->UnaccountedFree(
+ free_start, size);
max_freed_bytes = Max(freed_bytes, max_freed_bytes);
} else {
p->heap()->CreateFillerObjectAt(free_start, size,
@@ -3883,21 +3880,16 @@ int MarkCompactCollector::Sweeper::ParallelSweepPage(Page* page,
return 0;
}
page->concurrent_sweeping_state().SetValue(Page::kSweepingInProgress);
+ const Sweeper::FreeSpaceTreatmentMode free_space_mode =
+ Heap::ShouldZapGarbage() ? ZAP_FREE_SPACE : IGNORE_FREE_SPACE;
if (identity == NEW_SPACE) {
- RawSweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST,
- IGNORE_FREE_LIST, IGNORE_FREE_SPACE>(nullptr, page, nullptr);
+ RawSweep(page, IGNORE_FREE_LIST, free_space_mode);
} else if (identity == OLD_SPACE) {
- max_freed = RawSweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST,
- REBUILD_FREE_LIST, IGNORE_FREE_SPACE>(
- heap_->paged_space(identity), page, nullptr);
+ max_freed = RawSweep(page, REBUILD_FREE_LIST, free_space_mode);
} else if (identity == CODE_SPACE) {
- max_freed = RawSweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, REBUILD_SKIP_LIST,
- REBUILD_FREE_LIST, IGNORE_FREE_SPACE>(
- heap_->paged_space(identity), page, nullptr);
+ max_freed = RawSweep(page, REBUILD_FREE_LIST, free_space_mode);
} else {
- max_freed = RawSweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST,
- REBUILD_FREE_LIST, IGNORE_FREE_SPACE>(
- heap_->paged_space(identity), page, nullptr);
+ max_freed = RawSweep(page, REBUILD_FREE_LIST, free_space_mode);
}
{
base::LockGuard<base::Mutex> guard(&mutex_);
@@ -3990,9 +3982,9 @@ void MarkCompactCollector::StartSweepSpace(PagedSpace* space) {
// (in the free list) dropped again. Since we only use the flag for
// testing this is fine.
p->concurrent_sweeping_state().SetValue(Page::kSweepingInProgress);
- Sweeper::RawSweep<Sweeper::SWEEP_ONLY, Sweeper::SWEEP_ON_MAIN_THREAD,
- Sweeper::IGNORE_SKIP_LIST, Sweeper::IGNORE_FREE_LIST,
- Sweeper::IGNORE_FREE_SPACE>(space, p, nullptr);
+ Sweeper::RawSweep(p, Sweeper::IGNORE_FREE_LIST,
+ Heap::ShouldZapGarbage() ? Sweeper::ZAP_FREE_SPACE
+ : Sweeper::IGNORE_FREE_SPACE);
continue;
}
« no previous file with comments | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698