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