diff options
Diffstat (limited to 'deps/v8/src/optimizing-compiler-thread.cc')
-rw-r--r-- | deps/v8/src/optimizing-compiler-thread.cc | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/deps/v8/src/optimizing-compiler-thread.cc b/deps/v8/src/optimizing-compiler-thread.cc index 06018dd1a..b982b9419 100644 --- a/deps/v8/src/optimizing-compiler-thread.cc +++ b/deps/v8/src/optimizing-compiler-thread.cc @@ -48,6 +48,13 @@ void OptimizingCompilerThread::Run() { while (true) { input_queue_semaphore_->Wait(); + Logger::TimerEventScope timer( + isolate_, Logger::TimerEventScope::v8_recompile_parallel); + + if (FLAG_parallel_recompilation_delay != 0) { + OS::Sleep(FLAG_parallel_recompilation_delay); + } + if (Acquire_Load(&stop_thread_)) { stop_semaphore_->Signal(); if (FLAG_trace_parallel_recompilation) { @@ -59,20 +66,7 @@ void OptimizingCompilerThread::Run() { int64_t compiling_start = 0; if (FLAG_trace_parallel_recompilation) compiling_start = OS::Ticks(); - Heap::RelocationLock relocation_lock(isolate_->heap()); - OptimizingCompiler* optimizing_compiler = NULL; - input_queue_.Dequeue(&optimizing_compiler); - Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(-1)); - - ASSERT(!optimizing_compiler->info()->closure()->IsOptimized()); - - OptimizingCompiler::Status status = optimizing_compiler->OptimizeGraph(); - ASSERT(status != OptimizingCompiler::FAILED); - // Prevent an unused-variable error in release mode. - USE(status); - - output_queue_.Enqueue(optimizing_compiler); - isolate_->stack_guard()->RequestCodeReadyEvent(); + CompileNext(); if (FLAG_trace_parallel_recompilation) { time_spent_compiling_ += OS::Ticks() - compiling_start; @@ -81,11 +75,40 @@ void OptimizingCompilerThread::Run() { } +void OptimizingCompilerThread::CompileNext() { + OptimizingCompiler* optimizing_compiler = NULL; + input_queue_.Dequeue(&optimizing_compiler); + Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(-1)); + + // The function may have already been optimized by OSR. Simply continue. + OptimizingCompiler::Status status = optimizing_compiler->OptimizeGraph(); + USE(status); // Prevent an unused-variable error in release mode. + ASSERT(status != OptimizingCompiler::FAILED); + + // The function may have already been optimized by OSR. Simply continue. + // Mark it for installing before queuing so that we can be sure of the write + // order: marking first and (after being queued) installing code second. + optimizing_compiler->info()->closure()->MarkForInstallingRecompiledCode(); + output_queue_.Enqueue(optimizing_compiler); +} + + void OptimizingCompilerThread::Stop() { + ASSERT(!IsOptimizerThread()); Release_Store(&stop_thread_, static_cast<AtomicWord>(true)); input_queue_semaphore_->Signal(); stop_semaphore_->Wait(); + if (FLAG_parallel_recompilation_delay != 0) { + InstallOptimizedFunctions(); + // Barrier when loading queue length is not necessary since the write + // happens in CompileNext on the same thread. + while (NoBarrier_Load(&queue_length_) > 0) { + CompileNext(); + InstallOptimizedFunctions(); + } + } + if (FLAG_trace_parallel_recompilation) { double compile_time = static_cast<double>(time_spent_compiling_); double total_time = static_cast<double>(time_spent_total_); @@ -96,26 +119,29 @@ void OptimizingCompilerThread::Stop() { void OptimizingCompilerThread::InstallOptimizedFunctions() { + ASSERT(!IsOptimizerThread()); HandleScope handle_scope(isolate_); int functions_installed = 0; while (!output_queue_.IsEmpty()) { - OptimizingCompiler* compiler = NULL; + OptimizingCompiler* compiler; output_queue_.Dequeue(&compiler); Compiler::InstallOptimizedCode(compiler); functions_installed++; } - if (FLAG_trace_parallel_recompilation && functions_installed != 0) { - PrintF(" ** Installed %d function(s).\n", functions_installed); - } } void OptimizingCompilerThread::QueueForOptimization( OptimizingCompiler* optimizing_compiler) { + ASSERT(IsQueueAvailable()); + ASSERT(!IsOptimizerThread()); + Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(1)); + optimizing_compiler->info()->closure()->MarkInRecompileQueue(); input_queue_.Enqueue(optimizing_compiler); input_queue_semaphore_->Signal(); } + #ifdef DEBUG bool OptimizingCompilerThread::IsOptimizerThread() { if (!FLAG_parallel_recompilation) return false; |