Add basic support for parallel compaction and flag.
authorhpayer <hpayer@chromium.org>
Tue, 25 Aug 2015 15:26:45 +0000 (08:26 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 25 Aug 2015 15:26:54 +0000 (15:26 +0000)
BUG=524425
LOG=n

Review URL: https://codereview.chromium.org/1314903002

Cr-Commit-Position: refs/heads/master@{#30359}

src/flag-definitions.h
src/heap/mark-compact.cc
src/heap/mark-compact.h

index 17a69bf..8bedd69 100644 (file)
@@ -664,6 +664,7 @@ DEFINE_INT(min_progress_during_object_groups_marking, 128,
 DEFINE_INT(max_object_groups_marking_rounds, 3,
            "at most try this many times to over approximate the weak closure")
 DEFINE_BOOL(concurrent_sweeping, true, "use concurrent sweeping")
+DEFINE_BOOL(parallel_compaction, false, "use parallel compaction")
 DEFINE_BOOL(trace_incremental_marking, false,
             "trace progress of the incremental marking")
 DEFINE_BOOL(track_gc_object_stats, false,
@@ -813,6 +814,7 @@ DEFINE_BOOL(predictable, false, "enable predictable mode")
 DEFINE_NEG_IMPLICATION(predictable, concurrent_recompilation)
 DEFINE_NEG_IMPLICATION(predictable, concurrent_osr)
 DEFINE_NEG_IMPLICATION(predictable, concurrent_sweeping)
+DEFINE_NEG_IMPLICATION(predictable, parallel_compaction)
 
 // mark-compact.cc
 DEFINE_BOOL(force_marking_deque_overflows, false,
index 202f4db..dc93a5a 100644 (file)
@@ -48,6 +48,7 @@ MarkCompactCollector::MarkCompactCollector(Heap* heap)
       was_marked_incrementally_(false),
       sweeping_in_progress_(false),
       pending_sweeper_jobs_semaphore_(0),
+      pending_compaction_jobs_semaphore_(0),
       evacuation_(false),
       migration_slots_buffer_(NULL),
       heap_(heap),
@@ -459,6 +460,28 @@ void MarkCompactCollector::ClearMarkbits() {
 }
 
 
+class MarkCompactCollector::CompactionTask : public v8::Task {
+ public:
+  explicit CompactionTask(Heap* heap) : heap_(heap) {}
+
+  virtual ~CompactionTask() {}
+
+ private:
+  // v8::Task overrides.
+  void Run() override {
+    // TODO(mlippautz, hpayer): EvacuatePages is not thread-safe and can just be
+    // called by one thread concurrently.
+    heap_->mark_compact_collector()->EvacuatePages();
+    heap_->mark_compact_collector()
+        ->pending_compaction_jobs_semaphore_.Signal();
+  }
+
+  Heap* heap_;
+
+  DISALLOW_COPY_AND_ASSIGN(CompactionTask);
+};
+
+
 class MarkCompactCollector::SweeperTask : public v8::Task {
  public:
   SweeperTask(Heap* heap, PagedSpace* space) : heap_(heap), space_(space) {}
@@ -3289,6 +3312,12 @@ void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p) {
 }
 
 
+void MarkCompactCollector::EvacuatePagesInParallel() {
+  V8::GetCurrentPlatform()->CallOnBackgroundThread(
+      new CompactionTask(heap()), v8::Platform::kShortRunningTask);
+}
+
+
 void MarkCompactCollector::EvacuatePages() {
   int npages = evacuation_candidates_.length();
   int abandoned_pages = 0;
@@ -3595,7 +3624,12 @@ void MarkCompactCollector::EvacuateNewSpaceAndCandidates() {
     GCTracer::Scope gc_scope(heap()->tracer(),
                              GCTracer::Scope::MC_EVACUATE_PAGES);
     EvacuationScope evacuation_scope(this);
-    EvacuatePages();
+    if (FLAG_parallel_compaction) {
+      EvacuatePagesInParallel();
+      pending_compaction_jobs_semaphore_.Wait();
+    } else {
+      EvacuatePages();
+    }
   }
 
   // Second pass: find pointers to new space and update them.
index 7e62012..d6ff1c9 100644 (file)
@@ -669,6 +669,7 @@ class MarkCompactCollector {
   void RemoveObjectSlots(Address start_slot, Address end_slot);
 
  private:
+  class CompactionTask;
   class SweeperTask;
 
   explicit MarkCompactCollector(Heap* heap);
@@ -706,8 +707,12 @@ class MarkCompactCollector {
   // True if concurrent or parallel sweeping is currently in progress.
   bool sweeping_in_progress_;
 
+  // Synchronize sweeper threads.
   base::Semaphore pending_sweeper_jobs_semaphore_;
 
+  // Synchronize compaction threads.
+  base::Semaphore pending_compaction_jobs_semaphore_;
+
   bool evacuation_;
 
   SlotsBufferAllocator slots_buffer_allocator_;
@@ -866,6 +871,8 @@ class MarkCompactCollector {
 
   void EvacuatePages();
 
+  void EvacuatePagesInParallel();
+
   void EvacuateNewSpaceAndCandidates();
 
   void ReleaseEvacuationCandidates();