1304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// Redistribution and use in source and binary forms, with or without 3304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// modification, are permitted provided that the following conditions are 4304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// met: 5304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// 6304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// * Redistributions of source code must retain the above copyright 7304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// notice, this list of conditions and the following disclaimer. 8304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// * Redistributions in binary form must reproduce the above 9304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// copyright notice, this list of conditions and the following 10304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// disclaimer in the documentation and/or other materials provided 11304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// with the distribution. 12304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// * Neither the name of Google Inc. nor the names of its 13304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// contributors may be used to endorse or promote products derived 14304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// from this software without specific prior written permission. 15304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// 16304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 28304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "optimizing-compiler-thread.h" 29304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 30304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "v8.h" 31304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 32304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "hydrogen.h" 33304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "isolate.h" 34304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "v8threads.h" 35304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 36304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgnamespace v8 { 37304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgnamespace internal { 38304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 39304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 40304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid OptimizingCompilerThread::Run() { 41304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#ifdef DEBUG 421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org { ScopedLock lock(thread_id_mutex_); 431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org thread_id_ = ThreadId::Current().ToInteger(); 441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 45304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#endif 46304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Isolate::SetIsolateThreadLocals(isolate_, NULL); 4779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_allocation; 4879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHandleAllocation no_handles; 4979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHandleDereference no_deref; 50304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 51304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org int64_t epoch = 0; 52304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (FLAG_trace_parallel_recompilation) epoch = OS::Ticks(); 53304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 54304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org while (true) { 55304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org input_queue_semaphore_->Wait(); 568e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Logger::TimerEventScope timer( 571f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org isolate_, Logger::TimerEventScope::v8_recompile_parallel); 58750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 59750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (FLAG_parallel_recompilation_delay != 0) { 60750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org OS::Sleep(FLAG_parallel_recompilation_delay); 61750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 62750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org switch (static_cast<StopFlag>(Acquire_Load(&stop_thread_))) { 64594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org case CONTINUE: 65594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org break; 66594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org case STOP: 67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (FLAG_trace_parallel_recompilation) { 68594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org time_spent_total_ = OS::Ticks() - epoch; 69594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org stop_semaphore_->Signal(); 71594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return; 72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org case FLUSH: 73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // The main thread is blocked, waiting for the stop semaphore. 74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org { AllowHandleDereference allow_handle_dereference; 75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org FlushInputQueue(true); 76594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 77594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Release_Store(&queue_length_, static_cast<AtomicWord>(0)); 78594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE)); 79594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org stop_semaphore_->Signal(); 80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Return to start of consumer loop. 81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org continue; 82304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 83304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 84304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org int64_t compiling_start = 0; 85304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (FLAG_trace_parallel_recompilation) compiling_start = OS::Ticks(); 86304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 87750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org CompileNext(); 88304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 89304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (FLAG_trace_parallel_recompilation) { 90304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org time_spent_compiling_ += OS::Ticks() - compiling_start; 91304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 92304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 93304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 94304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 95304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 96750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgvoid OptimizingCompilerThread::CompileNext() { 97750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org OptimizingCompiler* optimizing_compiler = NULL; 98594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool result = input_queue_.Dequeue(&optimizing_compiler); 99594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org USE(result); 100594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(result); 101750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(-1)); 102750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // The function may have already been optimized by OSR. Simply continue. 104750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org OptimizingCompiler::Status status = optimizing_compiler->OptimizeGraph(); 1052bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org USE(status); // Prevent an unused-variable error in release mode. 106750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ASSERT(status != OptimizingCompiler::FAILED); 1076e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1082bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org // The function may have already been optimized by OSR. Simply continue. 1091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Use a mutex to make sure that functions marked for install 1101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // are always also queued. 1111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ScopedLock mark_and_queue(install_mutex_); 112ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org { Heap::RelocationLock relocation_lock(isolate_->heap()); 11379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org AllowHandleDereference ahd; 114ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org optimizing_compiler->info()->closure()->MarkForInstallingRecompiledCode(); 115ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org } 1162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org output_queue_.Enqueue(optimizing_compiler); 117750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 118750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 119750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 120594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid OptimizingCompilerThread::FlushInputQueue(bool restore_function_code) { 121594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org OptimizingCompiler* optimizing_compiler; 122594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // The optimizing compiler is allocated in the CompilationInfo's zone. 123594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org while (input_queue_.Dequeue(&optimizing_compiler)) { 124594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // This should not block, since we have one signal on the input queue 125594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // semaphore corresponding to each element in the input queue. 126594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org input_queue_semaphore_->Wait(); 127594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org CompilationInfo* info = optimizing_compiler->info(); 128594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (restore_function_code) { 129594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Handle<JSFunction> function = info->closure(); 130594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function->ReplaceCode(function->shared()->code()); 131594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 132594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org delete info; 133594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 134594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 135594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 136594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 137594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) { 138594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org OptimizingCompiler* optimizing_compiler; 139594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // The optimizing compiler is allocated in the CompilationInfo's zone. 140594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org while (output_queue_.Dequeue(&optimizing_compiler)) { 141594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org CompilationInfo* info = optimizing_compiler->info(); 142594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (restore_function_code) { 143594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Handle<JSFunction> function = info->closure(); 144594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org function->ReplaceCode(function->shared()->code()); 145594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 146594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org delete info; 147594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 148594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 149594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 150594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 151594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid OptimizingCompilerThread::Flush() { 152594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(!IsOptimizerThread()); 153594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Release_Store(&stop_thread_, static_cast<AtomicWord>(FLUSH)); 154594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org input_queue_semaphore_->Signal(); 155594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org stop_semaphore_->Wait(); 156594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org FlushOutputQueue(true); 157594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 158594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 159594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 160304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid OptimizingCompilerThread::Stop() { 1616e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(!IsOptimizerThread()); 162594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Release_Store(&stop_thread_, static_cast<AtomicWord>(STOP)); 163304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org input_queue_semaphore_->Signal(); 164304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org stop_semaphore_->Wait(); 165304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 166750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (FLAG_parallel_recompilation_delay != 0) { 167750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Barrier when loading queue length is not necessary since the write 168750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // happens in CompileNext on the same thread. 169594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // This is used only for testing. 1701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org while (NoBarrier_Load(&queue_length_) > 0) CompileNext(); 1711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InstallOptimizedFunctions(); 1721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else { 173594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org FlushInputQueue(false); 174594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org FlushOutputQueue(false); 175750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 176750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 177304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (FLAG_trace_parallel_recompilation) { 178304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org double compile_time = static_cast<double>(time_spent_compiling_); 179304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org double total_time = static_cast<double>(time_spent_total_); 180304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org double percentage = (compile_time * 100) / total_time; 181304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org PrintF(" ** Compiler thread did %.2f%% useful work\n", percentage); 182304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 18393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 18493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Join(); 185304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 186304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 187304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 188304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid OptimizingCompilerThread::InstallOptimizedFunctions() { 1896e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(!IsOptimizerThread()); 190304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org HandleScope handle_scope(isolate_); 1911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org OptimizingCompiler* compiler; 1921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org while (true) { 1931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org { // Memory barrier to ensure marked functions are queued. 1941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ScopedLock marked_and_queued(install_mutex_); 1951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (!output_queue_.Dequeue(&compiler)) return; 1961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 197304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Compiler::InstallOptimizedCode(compiler); 198304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 199fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org} 200fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 201fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 202304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid OptimizingCompilerThread::QueueForOptimization( 203304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org OptimizingCompiler* optimizing_compiler) { 204068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org ASSERT(IsQueueAvailable()); 2056e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(!IsOptimizerThread()); 206068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(1)); 2072bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org optimizing_compiler->info()->closure()->MarkInRecompileQueue(); 208304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org input_queue_.Enqueue(optimizing_compiler); 209304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org input_queue_semaphore_->Signal(); 210304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 211304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 2126e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 213304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#ifdef DEBUG 214304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgbool OptimizingCompilerThread::IsOptimizerThread() { 215304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (!FLAG_parallel_recompilation) return false; 2161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ScopedLock lock(thread_id_mutex_); 217304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org return ThreadId::Current().ToInteger() == thread_id_; 218304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 219304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#endif 220304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 221304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 222304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} } // namespace v8::internal 223