Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 556dde0718fa6962ff3d8aeddaa4cbf958dc7df6..3267a796c1de0e23a19a37e94e0e0f650efa1b0d 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -131,6 +131,24 @@ v8::TryCatch* ThreadLocalTop::TryCatchHandler() { |
} |
+int SystemThreadManager::NumberOfParallelSystemThreads( |
+ ParallelSystemComponent type) { |
+ int number_of_threads = Min(OS::NumberOfCores(), kMaxThreads); |
+ ASSERT(number_of_threads > 0); |
+ if (number_of_threads == 1) { |
+ return 1; |
+ } |
+ if (type == PARALLEL_SWEEPING) { |
+ return number_of_threads; |
+ } else if (type == CONCURRENT_SWEEPING) { |
+ return number_of_threads - 1; |
+ } else if (type == PARALLEL_MARKING) { |
+ return number_of_threads; |
+ } |
+ return 1; |
+} |
+ |
+ |
// Create a dummy thread that will wait forever on a semaphore. The only |
// purpose for this thread is to have some stack area to save essential data |
// into for use by a stacks only core dump (aka minidump). |
@@ -1753,7 +1771,7 @@ void Isolate::Deinit() { |
if (state_ == INITIALIZED) { |
TRACE_ISOLATE(deinit); |
- if (FLAG_concurrent_sweeping || FLAG_parallel_sweeping) { |
+ if (FLAG_sweeper_threads > 0) { |
for (int i = 0; i < FLAG_sweeper_threads; i++) { |
sweeper_thread_[i]->Stop(); |
delete sweeper_thread_[i]; |
@@ -1761,7 +1779,7 @@ void Isolate::Deinit() { |
delete[] sweeper_thread_; |
} |
- if (FLAG_parallel_marking) { |
+ if (FLAG_marking_threads > 0) { |
for (int i = 0; i < FLAG_marking_threads; i++) { |
marking_thread_[i]->Stop(); |
delete marking_thread_[i]; |
@@ -2139,10 +2157,12 @@ bool Isolate::Init(Deserializer* des) { |
if (FLAG_parallel_recompilation) optimizing_compiler_thread_.Start(); |
- if (FLAG_parallel_marking) { |
- if (FLAG_marking_threads < 1) { |
- FLAG_marking_threads = 1; |
- } |
+ if (FLAG_parallel_marking && FLAG_marking_threads == 0) { |
+ FLAG_marking_threads = SystemThreadManager:: |
+ NumberOfParallelSystemThreads( |
+ SystemThreadManager::PARALLEL_MARKING); |
+ } |
+ if (FLAG_marking_threads > 0) { |
marking_thread_ = new MarkingThread*[FLAG_marking_threads]; |
for (int i = 0; i < FLAG_marking_threads; i++) { |
marking_thread_[i] = new MarkingThread(this); |
@@ -2150,10 +2170,18 @@ bool Isolate::Init(Deserializer* des) { |
} |
} |
- if (FLAG_parallel_sweeping || FLAG_concurrent_sweeping) { |
- if (FLAG_sweeper_threads < 1) { |
- FLAG_sweeper_threads = 1; |
+ if (FLAG_sweeper_threads == 0) { |
+ if (FLAG_concurrent_sweeping) { |
+ FLAG_sweeper_threads = SystemThreadManager:: |
+ NumberOfParallelSystemThreads( |
+ SystemThreadManager::CONCURRENT_SWEEPING); |
+ } else if (FLAG_parallel_sweeping) { |
+ FLAG_sweeper_threads = SystemThreadManager:: |
+ NumberOfParallelSystemThreads( |
+ SystemThreadManager::PARALLEL_SWEEPING); |
} |
+ } |
+ if (FLAG_sweeper_threads > 0) { |
sweeper_thread_ = new SweeperThread*[FLAG_sweeper_threads]; |
for (int i = 0; i < FLAG_sweeper_threads; i++) { |
sweeper_thread_[i] = new SweeperThread(this); |