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