Chromium Code Reviews| Index: src/isolate.cc |
| diff --git a/src/isolate.cc b/src/isolate.cc |
| index 556dde0718fa6962ff3d8aeddaa4cbf958dc7df6..654c6b3c7c545ae626c1264897a207aad64ded02 100644 |
| --- a/src/isolate.cc |
| +++ b/src/isolate.cc |
| @@ -131,6 +131,20 @@ v8::TryCatch* ThreadLocalTop::TryCatchHandler() { |
| } |
| +int SystemThreadManager::NumberOfParallelSystemThreads( |
| + ParallelSystemComponent type) { |
| + int number_of_cores = OS::NumberOfCores(); |
| + if (type == PARALLEL_SWEEPING) { |
| + return number_of_cores; |
| + } else if (type == CONCURRENT_SWEEPING) { |
| + return number_of_cores - 1; |
| + } else if (type == PARALLEL_MARKING) { |
| + return number_of_cores; |
|
Michael Starzinger
2013/02/27 12:13:09
Let's cap the number of threads to a certain maxim
Hannes Payer (out of office)
2013/02/27 12:43:29
Done.
|
| + } |
| + 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 +1767,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 +1775,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 +2153,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 +2166,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); |