Wait for sweeper threads in incremental marking step when sweeper threads are done...
authorhpayer@chromium.org <hpayer@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 29 Apr 2014 14:17:42 +0000 (14:17 +0000)
committerhpayer@chromium.org <hpayer@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 29 Apr 2014 14:17:42 +0000 (14:17 +0000)
BUG=
R=mstarzinger@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@21058 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/incremental-marking.cc
src/mark-compact.cc
src/mark-compact.h
src/sweeper-thread.cc
src/sweeper-thread.h

index c32155e..bb2c9ac 100644 (file)
@@ -886,6 +886,10 @@ void IncrementalMarking::Step(intptr_t allocated_bytes,
   }
 
   if (state_ == SWEEPING) {
+    if (heap_->mark_compact_collector()->IsConcurrentSweepingInProgress() &&
+        heap_->mark_compact_collector()->IsSweepingCompleted()) {
+      heap_->mark_compact_collector()->WaitUntilSweepingCompleted();
+    }
     if (!heap_->mark_compact_collector()->IsConcurrentSweepingInProgress()) {
       bytes_scanned_ = 0;
       StartMarking(PREVENT_COMPACTION);
index 8263b5d..1a11053 100644 (file)
@@ -608,6 +608,22 @@ void MarkCompactCollector::WaitUntilSweepingCompleted() {
 }
 
 
+bool MarkCompactCollector::IsSweepingCompleted() {
+  for (int i = 0; i < isolate()->num_sweeper_threads(); i++) {
+    if (!isolate()->sweeper_threads()[i]->SweepingCompleted()) {
+      return false;
+    }
+  }
+  if (FLAG_job_based_sweeping) {
+    if (!pending_sweeper_jobs_semaphore_.WaitFor(TimeDelta::FromSeconds(0))) {
+      return false;
+    }
+    pending_sweeper_jobs_semaphore_.Signal();
+  }
+  return true;
+}
+
+
 void MarkCompactCollector::RefillFreeList(PagedSpace* space) {
   FreeList* free_list;
 
index c256600..254f258 100644 (file)
@@ -671,6 +671,8 @@ class MarkCompactCollector {
 
   void WaitUntilSweepingCompleted();
 
+  bool IsSweepingCompleted();
+
   void RefillFreeList(PagedSpace* space);
 
   bool AreSweeperThreadsActivated();
index 5a50c64..e8c8cd6 100644 (file)
@@ -66,6 +66,15 @@ void SweeperThread::WaitForSweeperThread() {
 }
 
 
+bool SweeperThread::SweepingCompleted() {
+  bool value = end_sweeping_semaphore_.WaitFor(TimeDelta::FromSeconds(0));
+  if (value) {
+    end_sweeping_semaphore_.Signal();
+  }
+  return value;
+}
+
+
 int SweeperThread::NumberOfThreads(int max_available) {
   if (!FLAG_concurrent_sweeping && !FLAG_parallel_sweeping) return 0;
   if (FLAG_sweeper_threads > 0) return FLAG_sweeper_threads;
index 8ed3cef..794e660 100644 (file)
@@ -26,6 +26,7 @@ class SweeperThread : public Thread {
   void Stop();
   void StartSweeping();
   void WaitForSweeperThread();
+  bool SweepingCompleted();
 
   static int NumberOfThreads(int max_available);