From 728aabfc2c68b976d9298323d42da3582b61e623 Mon Sep 17 00:00:00 2001 From: "hpayer@chromium.org" Date: Tue, 29 Apr 2014 14:17:42 +0000 Subject: [PATCH] Wait for sweeper threads in incremental marking step when sweeper threads are done sweeping. 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 | 4 ++++ src/mark-compact.cc | 16 ++++++++++++++++ src/mark-compact.h | 2 ++ src/sweeper-thread.cc | 9 +++++++++ src/sweeper-thread.h | 1 + 5 files changed, 32 insertions(+) diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc index c32155e..bb2c9ac 100644 --- a/src/incremental-marking.cc +++ b/src/incremental-marking.cc @@ -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); diff --git a/src/mark-compact.cc b/src/mark-compact.cc index 8263b5d..1a11053 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -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; diff --git a/src/mark-compact.h b/src/mark-compact.h index c256600..254f258 100644 --- a/src/mark-compact.h +++ b/src/mark-compact.h @@ -671,6 +671,8 @@ class MarkCompactCollector { void WaitUntilSweepingCompleted(); + bool IsSweepingCompleted(); + void RefillFreeList(PagedSpace* space); bool AreSweeperThreadsActivated(); diff --git a/src/sweeper-thread.cc b/src/sweeper-thread.cc index 5a50c64..e8c8cd6 100644 --- a/src/sweeper-thread.cc +++ b/src/sweeper-thread.cc @@ -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; diff --git a/src/sweeper-thread.h b/src/sweeper-thread.h index 8ed3cef..794e660 100644 --- a/src/sweeper-thread.h +++ b/src/sweeper-thread.h @@ -26,6 +26,7 @@ class SweeperThread : public Thread { void Stop(); void StartSweeping(); void WaitForSweeperThread(); + bool SweepingCompleted(); static int NumberOfThreads(int max_available); -- 2.7.4