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

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

Issue 1851733002: [heap] Fix computation of flags offset in memorychunk (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 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/incremental-marking.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 cd207bcda27ba792ec2291abead68006c86932be..c726fe53fe876c5461e98f0d744525747eca477f 100644
--- a/src/heap/mark-compact.h
+++ b/src/heap/mark-compact.h
@@ -400,6 +400,99 @@ class MarkCompactCollector {
public:
class Evacuator;
+ class Sweeper {
+ public:
+ class SweeperTask;
+
+ 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 };
+ enum SweepingParallelism { SWEEP_ON_MAIN_THREAD, SWEEP_IN_PARALLEL };
+
+ typedef std::vector<Page*> SweepingList;
+ typedef List<Page*> SweptList;
+
+ enum SweepingSpace {
+ kOldSpace,
+ kCodeSpace,
+ kMapSpace,
+ kNumberOfSweepingSpaces,
+ };
+
+ template <SweepingMode sweeping_mode, SweepingParallelism parallelism,
+ SkipListRebuildingMode skip_list_mode,
+ FreeSpaceTreatmentMode free_space_mode>
+ static int UnmanagedSweep(PagedSpace* space, Page* p, ObjectVisitor* v);
+
+ explicit Sweeper(Heap* heap)
+ : heap_(heap),
+ pending_sweeper_tasks_semaphore_(0),
+ sweeping_in_progress_(false) {}
+
+ bool sweeping_in_progress() { return sweeping_in_progress_; }
+
+ void AddPage(PagedSpace* space, Page* page);
+ void AddLatePage(SweepingSpace space, Page* page);
+ void CommitLateList(SweepingSpace space);
+
+ int HelpSweepInParallel(Page* page, PagedSpace* space);
+ int HelpSweepInParallel(PagedSpace* space, int required_freed_bytes,
+ int max_pages = 0);
+
+ void StartSweeping();
+ void SweepOrWaitUntilSweepingCompleted(Page* page);
+ void EnsureCompleted();
+ bool IsSweepingCompleted();
+ void ParallelSweepSpacesComplete();
+
+ void AddSweptPageSafe(PagedSpace* space, Page* page);
+ Page* GetSweptPage(PagedSpace* space);
+
+ private:
+ AllocationSpace allocation_space(SweepingSpace space) {
+ switch (space) {
+ case kOldSpace:
+ return OLD_SPACE;
+ case kCodeSpace:
+ return CODE_SPACE;
+ case kMapSpace:
+ return MAP_SPACE;
+ default:
+ UNREACHABLE();
+ }
+ UNREACHABLE();
+ return OLD_SPACE;
+ }
+
+ SweepingSpace sweeping_space(AllocationSpace space) {
+ switch (space) {
+ case OLD_SPACE:
+ return kOldSpace;
+ case CODE_SPACE:
+ return kCodeSpace;
+ case MAP_SPACE:
+ return kMapSpace;
+ default:
+ UNREACHABLE();
+ }
+ UNREACHABLE();
+ return kOldSpace;
+ }
+
+ void PrepareAddPage(SweepingSpace space, Page* page);
+
+ Heap* heap_;
+ base::Mutex mutex_;
+ base::Semaphore pending_sweeper_tasks_semaphore_;
+ SweptList swept_list_[kNumberOfSweepingSpaces];
+ SweepingList sweeping_list_[kNumberOfSweepingSpaces];
+ SweepingList* late_sweeping_list_[kNumberOfSweepingSpaces];
+ SweepingList* tmp_late_sweeping_list_[kNumberOfSweepingSpaces];
+ bool sweeping_in_progress_;
+
+ friend class SweeperTask;
+ };
+
enum IterationMode {
kKeepMarking,
kClearMarkbits,
@@ -490,38 +583,19 @@ class MarkCompactCollector {
MarkingParity marking_parity() { return marking_parity_; }
- // Concurrent and parallel sweeping support. If required_freed_bytes was set
- // to a value larger than 0, then sweeping returns after a block of at least
- // required_freed_bytes was freed. If required_freed_bytes was set to zero
- // then the whole given space is swept. It returns the size of the maximum
- // continuous freed memory chunk.
- int SweepInParallel(PagedSpace* space, int required_freed_bytes,
- int max_pages = 0);
-
- // Sweeps a given page concurrently to the sweeper threads. It returns the
- // size of the maximum continuous freed memory chunk.
- int SweepInParallel(Page* page, PagedSpace* space);
-
// Ensures that sweeping is finished.
//
// Note: Can only be called safely from main thread.
void EnsureSweepingCompleted();
- void SweepOrWaitUntilSweepingCompleted(Page* page);
-
// Help out in sweeping the corresponding space and refill memory that has
// been regained.
//
// Note: Thread-safe.
void SweepAndRefill(CompactionSpace* space);
- // If sweeper threads are not active this method will return true. If
- // this is a latency issue we should be smarter here. Otherwise, it will
- // return true if the sweeper threads are done processing the pages.
- bool IsSweepingCompleted();
-
// Checks if sweeping is in progress right now on any space.
- bool sweeping_in_progress() { return sweeping_in_progress_; }
+ bool sweeping_in_progress() { return sweeper().sweeping_in_progress(); }
void set_evacuation(bool evacuation) { evacuation_ = evacuation; }
@@ -562,27 +636,13 @@ class MarkCompactCollector {
// address range.
void RemoveObjectSlots(Address start_slot, Address end_slot);
- base::Mutex* swept_pages_mutex() { return &swept_pages_mutex_; }
- List<Page*>* swept_pages(AllocationSpace id) {
- switch (id) {
- case OLD_SPACE:
- return &swept_old_space_pages_;
- case CODE_SPACE:
- return &swept_code_space_pages_;
- case MAP_SPACE:
- return &swept_map_space_pages_;
- default:
- UNREACHABLE();
- }
- return nullptr;
- }
+ Sweeper& sweeper() { return sweeper_; }
private:
class EvacuateNewSpaceVisitor;
class EvacuateOldSpaceVisitor;
class EvacuateVisitorBase;
class HeapObjectVisitor;
- class SweeperTask;
typedef std::vector<Page*> SweepingList;
@@ -591,8 +651,6 @@ class MarkCompactCollector {
bool WillBeDeoptimized(Code* code);
void ClearInvalidRememberedSetSlots();
- void StartSweeperThreads();
-
void ComputeEvacuationHeuristics(int area_size,
int* target_fragmentation_percent,
int* max_evacuated_bytes);
@@ -761,8 +819,6 @@ class MarkCompactCollector {
// evacuation.
//
- inline SweepingList& sweeping_list(Space* space);
-
// If we are not compacting the heap, we simply sweep the spaces except
// for the large object space, clearing mark bits and adding unmarked
// regions to each space's free list.
@@ -797,10 +853,6 @@ class MarkCompactCollector {
// up other pages for sweeping.
void StartSweepSpace(PagedSpace* space);
- // Finalizes the parallel sweeping phase. Marks all the pages that were
- // swept in parallel.
- void ParallelSweepSpacesComplete();
-
#ifdef DEBUG
friend class MarkObjectVisitor;
static void VisitObject(HeapObject* obj);
@@ -819,30 +871,17 @@ class MarkCompactCollector {
List<Page*> evacuation_candidates_;
List<NewSpacePage*> newspace_evacuation_candidates_;
- base::Mutex swept_pages_mutex_;
- List<Page*> swept_old_space_pages_;
- List<Page*> swept_code_space_pages_;
- List<Page*> swept_map_space_pages_;
-
- SweepingList sweeping_list_old_space_;
- SweepingList sweeping_list_code_space_;
- SweepingList sweeping_list_map_space_;
-
// True if we are collecting slots to perform evacuation from evacuation
// candidates.
bool compacting_;
- // True if concurrent or parallel sweeping is currently in progress.
- bool sweeping_in_progress_;
-
- // Semaphore used to synchronize sweeper tasks.
- base::Semaphore pending_sweeper_tasks_semaphore_;
-
// Semaphore used to synchronize compaction tasks.
base::Semaphore pending_compaction_tasks_semaphore_;
bool black_allocation_;
+ Sweeper sweeper_;
+
friend class Heap;
friend class StoreBuffer;
};
« no previous file with comments | « src/heap/incremental-marking.cc ('k') | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698