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; |
} |