OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 #endif | 124 #endif |
125 thread_id_ = ThreadId::Current(); | 125 thread_id_ = ThreadId::Current(); |
126 } | 126 } |
127 | 127 |
128 | 128 |
129 v8::TryCatch* ThreadLocalTop::TryCatchHandler() { | 129 v8::TryCatch* ThreadLocalTop::TryCatchHandler() { |
130 return TRY_CATCH_FROM_ADDRESS(try_catch_handler_address()); | 130 return TRY_CATCH_FROM_ADDRESS(try_catch_handler_address()); |
131 } | 131 } |
132 | 132 |
133 | 133 |
134 int SystemThreadManager::NumberOfParallelSystemThreads( | |
135 ParallelSystemComponent type) { | |
136 int number_of_threads = Min(CPU::NumberOfProcessorsOnline(), kMaxThreads); | |
137 ASSERT(number_of_threads > 0); | |
138 if (number_of_threads == 1) { | |
139 return 0; | |
140 } | |
141 if (type == PARALLEL_SWEEPING) { | |
142 return number_of_threads; | |
143 } else if (type == CONCURRENT_SWEEPING) { | |
144 return number_of_threads - 1; | |
145 } | |
146 return 1; | |
147 } | |
148 | |
149 | |
150 // Create a dummy thread that will wait forever on a semaphore. The only | 134 // Create a dummy thread that will wait forever on a semaphore. The only |
151 // purpose for this thread is to have some stack area to save essential data | 135 // purpose for this thread is to have some stack area to save essential data |
152 // into for use by a stacks only core dump (aka minidump). | 136 // into for use by a stacks only core dump (aka minidump). |
153 class PreallocatedMemoryThread: public Thread { | 137 class PreallocatedMemoryThread: public Thread { |
154 public: | 138 public: |
155 char* data() { | 139 char* data() { |
156 if (data_ready_semaphore_ != NULL) { | 140 if (data_ready_semaphore_ != NULL) { |
157 // Initial access is guarded until the data has been published. | 141 // Initial access is guarded until the data has been published. |
158 data_ready_semaphore_->Wait(); | 142 data_ready_semaphore_->Wait(); |
159 delete data_ready_semaphore_; | 143 delete data_ready_semaphore_; |
(...skipping 1623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1783 random_number_generator_(NULL), | 1767 random_number_generator_(NULL), |
1784 has_fatal_error_(false), | 1768 has_fatal_error_(false), |
1785 use_crankshaft_(true), | 1769 use_crankshaft_(true), |
1786 initialized_from_snapshot_(false), | 1770 initialized_from_snapshot_(false), |
1787 cpu_profiler_(NULL), | 1771 cpu_profiler_(NULL), |
1788 heap_profiler_(NULL), | 1772 heap_profiler_(NULL), |
1789 function_entry_hook_(NULL), | 1773 function_entry_hook_(NULL), |
1790 deferred_handles_head_(NULL), | 1774 deferred_handles_head_(NULL), |
1791 optimizing_compiler_thread_(NULL), | 1775 optimizing_compiler_thread_(NULL), |
1792 sweeper_thread_(NULL), | 1776 sweeper_thread_(NULL), |
| 1777 num_sweeper_threads_(0), |
| 1778 max_available_threads_(0), |
1793 stress_deopt_count_(0) { | 1779 stress_deopt_count_(0) { |
1794 id_ = NoBarrier_AtomicIncrement(&isolate_counter_, 1); | 1780 id_ = NoBarrier_AtomicIncrement(&isolate_counter_, 1); |
1795 TRACE_ISOLATE(constructor); | 1781 TRACE_ISOLATE(constructor); |
1796 | 1782 |
1797 memset(isolate_addresses_, 0, | 1783 memset(isolate_addresses_, 0, |
1798 sizeof(isolate_addresses_[0]) * (kIsolateAddressCount + 1)); | 1784 sizeof(isolate_addresses_[0]) * (kIsolateAddressCount + 1)); |
1799 | 1785 |
1800 heap_.isolate_ = this; | 1786 heap_.isolate_ = this; |
1801 stack_guard_.isolate_ = this; | 1787 stack_guard_.isolate_ = this; |
1802 | 1788 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 | 1861 |
1876 | 1862 |
1877 void Isolate::Deinit() { | 1863 void Isolate::Deinit() { |
1878 if (state_ == INITIALIZED) { | 1864 if (state_ == INITIALIZED) { |
1879 TRACE_ISOLATE(deinit); | 1865 TRACE_ISOLATE(deinit); |
1880 | 1866 |
1881 #ifdef ENABLE_DEBUGGER_SUPPORT | 1867 #ifdef ENABLE_DEBUGGER_SUPPORT |
1882 debugger()->UnloadDebugger(); | 1868 debugger()->UnloadDebugger(); |
1883 #endif | 1869 #endif |
1884 | 1870 |
1885 if (FLAG_concurrent_recompilation) { | 1871 if (concurrent_recompilation_enabled()) { |
1886 optimizing_compiler_thread_->Stop(); | 1872 optimizing_compiler_thread_->Stop(); |
1887 delete optimizing_compiler_thread_; | 1873 delete optimizing_compiler_thread_; |
| 1874 optimizing_compiler_thread_ = NULL; |
1888 } | 1875 } |
1889 | 1876 |
1890 if (FLAG_sweeper_threads > 0) { | 1877 for (int i = 0; i < num_sweeper_threads_; i++) { |
1891 for (int i = 0; i < FLAG_sweeper_threads; i++) { | 1878 sweeper_thread_[i]->Stop(); |
1892 sweeper_thread_[i]->Stop(); | 1879 delete sweeper_thread_[i]; |
1893 delete sweeper_thread_[i]; | 1880 sweeper_thread_[i] = NULL; |
1894 } | |
1895 delete[] sweeper_thread_; | |
1896 } | 1881 } |
| 1882 delete[] sweeper_thread_; |
| 1883 sweeper_thread_ = NULL; |
| 1884 |
1897 | 1885 |
1898 if (FLAG_hydrogen_stats) GetHStatistics()->Print(); | 1886 if (FLAG_hydrogen_stats) GetHStatistics()->Print(); |
1899 | 1887 |
1900 if (FLAG_print_deopt_stress) { | 1888 if (FLAG_print_deopt_stress) { |
1901 PrintF(stdout, "=== Stress deopt counter: %u\n", stress_deopt_count_); | 1889 PrintF(stdout, "=== Stress deopt counter: %u\n", stress_deopt_count_); |
1902 } | 1890 } |
1903 | 1891 |
1904 // We must stop the logger before we tear down other components. | 1892 // We must stop the logger before we tear down other components. |
1905 Sampler* sampler = logger_->sampler(); | 1893 Sampler* sampler = logger_->sampler(); |
1906 if (sampler && sampler->IsActive()) sampler->Stop(); | 1894 if (sampler && sampler->IsActive()) sampler->Stop(); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2210 | 2198 |
2211 // SetUp the object heap. | 2199 // SetUp the object heap. |
2212 ASSERT(!heap_.HasBeenSetUp()); | 2200 ASSERT(!heap_.HasBeenSetUp()); |
2213 if (!heap_.SetUp()) { | 2201 if (!heap_.SetUp()) { |
2214 V8::FatalProcessOutOfMemory("heap setup"); | 2202 V8::FatalProcessOutOfMemory("heap setup"); |
2215 return false; | 2203 return false; |
2216 } | 2204 } |
2217 | 2205 |
2218 deoptimizer_data_ = new DeoptimizerData(memory_allocator_); | 2206 deoptimizer_data_ = new DeoptimizerData(memory_allocator_); |
2219 | 2207 |
2220 if (FLAG_concurrent_recompilation) { | |
2221 optimizing_compiler_thread_ = new OptimizingCompilerThread(this); | |
2222 optimizing_compiler_thread_->Start(); | |
2223 } | |
2224 | |
2225 const bool create_heap_objects = (des == NULL); | 2208 const bool create_heap_objects = (des == NULL); |
2226 if (create_heap_objects && !heap_.CreateHeapObjects()) { | 2209 if (create_heap_objects && !heap_.CreateHeapObjects()) { |
2227 V8::FatalProcessOutOfMemory("heap object creation"); | 2210 V8::FatalProcessOutOfMemory("heap object creation"); |
2228 return false; | 2211 return false; |
2229 } | 2212 } |
2230 | 2213 |
2231 if (create_heap_objects) { | 2214 if (create_heap_objects) { |
2232 // Terminate the cache array with the sentinel so we can iterate. | 2215 // Terminate the cache array with the sentinel so we can iterate. |
2233 PushToPartialSnapshotCache(heap_.undefined_value()); | 2216 PushToPartialSnapshotCache(heap_.undefined_value()); |
2234 } | 2217 } |
2235 | 2218 |
2236 InitializeThreadLocal(); | 2219 InitializeThreadLocal(); |
2237 | 2220 |
2238 bootstrapper_->Initialize(create_heap_objects); | 2221 bootstrapper_->Initialize(create_heap_objects); |
2239 builtins_.SetUp(this, create_heap_objects); | 2222 builtins_.SetUp(this, create_heap_objects); |
2240 | 2223 |
2241 if (create_heap_objects) heap_.CreateStubsRequiringBuiltins(); | 2224 if (create_heap_objects) heap_.CreateStubsRequiringBuiltins(); |
2242 | 2225 |
| 2226 // Set default value if not yet set. |
| 2227 // TODO(yangguo): move this to ResourceConstraints::ConfigureDefaults |
| 2228 // once ResourceConstraints becomes an argument to the Isolate constructor. |
| 2229 if (max_available_threads_ < 1) { |
| 2230 // Choose the default between 1 and 4. |
| 2231 max_available_threads_ = Max(Min(CPU::NumberOfProcessorsOnline(), 4), 1); |
| 2232 } |
| 2233 |
| 2234 num_sweeper_threads_ = SweeperThread::NumberOfThreads(max_available_threads_); |
| 2235 |
| 2236 if (FLAG_trace_hydrogen || FLAG_trace_hydrogen_stubs) { |
| 2237 PrintF("Concurrent recompilation has been disabled for tracing.\n"); |
| 2238 } else if (OptimizingCompilerThread::Enabled(max_available_threads_)) { |
| 2239 optimizing_compiler_thread_ = new OptimizingCompilerThread(this); |
| 2240 optimizing_compiler_thread_->Start(); |
| 2241 } |
| 2242 |
| 2243 if (num_sweeper_threads_ > 0) { |
| 2244 sweeper_thread_ = new SweeperThread*[num_sweeper_threads_]; |
| 2245 for (int i = 0; i < num_sweeper_threads_; i++) { |
| 2246 sweeper_thread_[i] = new SweeperThread(this); |
| 2247 sweeper_thread_[i]->Start(); |
| 2248 } |
| 2249 } |
| 2250 |
2243 // Only preallocate on the first initialization. | 2251 // Only preallocate on the first initialization. |
2244 if (FLAG_preallocate_message_memory && preallocated_message_space_ == NULL) { | 2252 if (FLAG_preallocate_message_memory && preallocated_message_space_ == NULL) { |
2245 // Start the thread which will set aside some memory. | 2253 // Start the thread which will set aside some memory. |
2246 PreallocatedMemoryThreadStart(); | 2254 PreallocatedMemoryThreadStart(); |
2247 preallocated_message_space_ = | 2255 preallocated_message_space_ = |
2248 new NoAllocationStringAllocator( | 2256 new NoAllocationStringAllocator( |
2249 preallocated_memory_thread_->data(), | 2257 preallocated_memory_thread_->data(), |
2250 preallocated_memory_thread_->length()); | 2258 preallocated_memory_thread_->length()); |
2251 PreallocatedStorageInit(preallocated_memory_thread_->length() / 4); | 2259 PreallocatedStorageInit(preallocated_memory_thread_->length() / 4); |
2252 } | 2260 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2327 BinaryOpStub::InitializeForIsolate(this); | 2335 BinaryOpStub::InitializeForIsolate(this); |
2328 CompareNilICStub::InitializeForIsolate(this); | 2336 CompareNilICStub::InitializeForIsolate(this); |
2329 ToBooleanStub::InitializeForIsolate(this); | 2337 ToBooleanStub::InitializeForIsolate(this); |
2330 ArrayConstructorStubBase::InstallDescriptors(this); | 2338 ArrayConstructorStubBase::InstallDescriptors(this); |
2331 InternalArrayConstructorStubBase::InstallDescriptors(this); | 2339 InternalArrayConstructorStubBase::InstallDescriptors(this); |
2332 FastNewClosureStub::InstallDescriptors(this); | 2340 FastNewClosureStub::InstallDescriptors(this); |
2333 NumberToStringStub::InstallDescriptors(this); | 2341 NumberToStringStub::InstallDescriptors(this); |
2334 NewStringAddStub::InstallDescriptors(this); | 2342 NewStringAddStub::InstallDescriptors(this); |
2335 } | 2343 } |
2336 | 2344 |
2337 if (FLAG_sweeper_threads > 0) { | |
2338 sweeper_thread_ = new SweeperThread*[FLAG_sweeper_threads]; | |
2339 for (int i = 0; i < FLAG_sweeper_threads; i++) { | |
2340 sweeper_thread_[i] = new SweeperThread(this); | |
2341 sweeper_thread_[i]->Start(); | |
2342 } | |
2343 } | |
2344 | |
2345 initialized_from_snapshot_ = (des != NULL); | 2345 initialized_from_snapshot_ = (des != NULL); |
2346 | 2346 |
2347 return true; | 2347 return true; |
2348 } | 2348 } |
2349 | 2349 |
2350 | 2350 |
2351 // Initialized lazily to allow early | 2351 // Initialized lazily to allow early |
2352 // v8::V8::SetAddHistogramSampleFunction calls. | 2352 // v8::V8::SetAddHistogramSampleFunction calls. |
2353 StatsTable* Isolate::stats_table() { | 2353 StatsTable* Isolate::stats_table() { |
2354 if (stats_table_ == NULL) { | 2354 if (stats_table_ == NULL) { |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2526 | 2526 |
2527 #ifdef DEBUG | 2527 #ifdef DEBUG |
2528 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ | 2528 #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ |
2529 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); | 2529 const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); |
2530 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) | 2530 ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) |
2531 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) | 2531 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) |
2532 #undef ISOLATE_FIELD_OFFSET | 2532 #undef ISOLATE_FIELD_OFFSET |
2533 #endif | 2533 #endif |
2534 | 2534 |
2535 } } // namespace v8::internal | 2535 } } // namespace v8::internal |
OLD | NEW |