| Index: src/mark-compact.cc | 
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc | 
| index f62435ea9334c196fc2231bb6e6893e7d0320aa1..6d5924b64e68d2bce1c3afee4fc5112045fd1a6f 100644 | 
| --- a/src/mark-compact.cc | 
| +++ b/src/mark-compact.cc | 
| @@ -67,6 +67,7 @@ MarkCompactCollector::MarkCompactCollector(Heap* heap) :  // NOLINT | 
| compacting_(false), | 
| was_marked_incrementally_(false), | 
| sweeping_pending_(false), | 
| +      pending_sweeper_jobs_semaphore_(0), | 
| sequential_sweeping_(false), | 
| tracer_(NULL), | 
| migration_slots_buffer_(NULL), | 
| @@ -569,11 +570,40 @@ void MarkCompactCollector::ClearMarkbits() { | 
| } | 
|  | 
|  | 
| +class MarkCompactCollector::SweeperTask : public v8::Task { | 
| + public: | 
| +  SweeperTask(Heap* heap, PagedSpace* space) | 
| +    : heap_(heap), space_(space) {} | 
| + | 
| +  virtual ~SweeperTask() {} | 
| + | 
| + private: | 
| +  // v8::Task overrides. | 
| +  virtual void Run() V8_OVERRIDE { | 
| +    heap_->mark_compact_collector()->SweepInParallel(space_); | 
| +    heap_->mark_compact_collector()->pending_sweeper_jobs_semaphore_.Signal(); | 
| +  } | 
| + | 
| +  Heap* heap_; | 
| +  PagedSpace* space_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(SweeperTask); | 
| +}; | 
| + | 
| + | 
| void MarkCompactCollector::StartSweeperThreads() { | 
| sweeping_pending_ = true; | 
| for (int i = 0; i < isolate()->num_sweeper_threads(); i++) { | 
| isolate()->sweeper_threads()[i]->StartSweeping(); | 
| } | 
| +  if (FLAG_job_based_sweeping) { | 
| +    V8::GetCurrentPlatform()->CallOnBackgroundThread( | 
| +        new SweeperTask(heap(), heap()->old_data_space()), | 
| +        v8::Platform::kShortRunningTask); | 
| +    V8::GetCurrentPlatform()->CallOnBackgroundThread( | 
| +        new SweeperTask(heap(), heap()->old_pointer_space()), | 
| +        v8::Platform::kShortRunningTask); | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -582,6 +612,11 @@ void MarkCompactCollector::WaitUntilSweepingCompleted() { | 
| for (int i = 0; i < isolate()->num_sweeper_threads(); i++) { | 
| isolate()->sweeper_threads()[i]->WaitForSweeperThread(); | 
| } | 
| +  if (FLAG_job_based_sweeping) { | 
| +    // Wait twice for both jobs. | 
| +    pending_sweeper_jobs_semaphore_.Wait(); | 
| +    pending_sweeper_jobs_semaphore_.Wait(); | 
| +  } | 
| sweeping_pending_ = false; | 
| RefillFreeLists(heap()->paged_space(OLD_DATA_SPACE)); | 
| RefillFreeLists(heap()->paged_space(OLD_POINTER_SPACE)); | 
| @@ -602,7 +637,7 @@ intptr_t MarkCompactCollector::RefillFreeLists(PagedSpace* space) { | 
|  | 
|  | 
| bool MarkCompactCollector::AreSweeperThreadsActivated() { | 
| -  return isolate()->sweeper_threads() != NULL; | 
| +  return isolate()->sweeper_threads() != NULL || FLAG_job_based_sweeping; | 
| } | 
|  | 
|  | 
| @@ -4124,7 +4159,7 @@ void MarkCompactCollector::SweepSpaces() { | 
| #endif | 
| SweeperType how_to_sweep = | 
| FLAG_lazy_sweeping ? LAZY_CONSERVATIVE : CONSERVATIVE; | 
| -  if (isolate()->num_sweeper_threads() > 0) { | 
| +  if (AreSweeperThreadsActivated()) { | 
| if (FLAG_parallel_sweeping) how_to_sweep = PARALLEL_CONSERVATIVE; | 
| if (FLAG_concurrent_sweeping) how_to_sweep = CONCURRENT_CONSERVATIVE; | 
| } | 
|  |