compileBroker.cpp revision 2132:850b2295a494
1/*
2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "classfile/systemDictionary.hpp"
27#include "classfile/vmSymbols.hpp"
28#include "code/codeCache.hpp"
29#include "compiler/compileBroker.hpp"
30#include "compiler/compileLog.hpp"
31#include "compiler/compilerOracle.hpp"
32#include "interpreter/linkResolver.hpp"
33#include "memory/allocation.inline.hpp"
34#include "oops/methodDataOop.hpp"
35#include "oops/methodOop.hpp"
36#include "oops/oop.inline.hpp"
37#include "prims/nativeLookup.hpp"
38#include "runtime/arguments.hpp"
39#include "runtime/compilationPolicy.hpp"
40#include "runtime/init.hpp"
41#include "runtime/interfaceSupport.hpp"
42#include "runtime/javaCalls.hpp"
43#include "runtime/os.hpp"
44#include "runtime/sharedRuntime.hpp"
45#include "runtime/sweeper.hpp"
46#include "utilities/dtrace.hpp"
47#ifdef COMPILER1
48#include "c1/c1_Compiler.hpp"
49#endif
50#ifdef COMPILER2
51#include "opto/c2compiler.hpp"
52#endif
53#ifdef SHARK
54#include "shark/sharkCompiler.hpp"
55#endif
56
57#ifdef DTRACE_ENABLED
58
59// Only bother with this argument setup if dtrace is available
60
61HS_DTRACE_PROBE_DECL8(hotspot, method__compile__begin,
62  char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t);
63HS_DTRACE_PROBE_DECL9(hotspot, method__compile__end,
64  char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t, bool);
65
66#define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method)              \
67  {                                                                      \
68    char* comp_name = (char*)(compiler)->name();                         \
69    Symbol* klass_name = (method)->klass_name();                         \
70    Symbol* name = (method)->name();                                     \
71    Symbol* signature = (method)->signature();                           \
72    HS_DTRACE_PROBE8(hotspot, method__compile__begin,                    \
73      comp_name, strlen(comp_name),                                      \
74      klass_name->bytes(), klass_name->utf8_length(),                    \
75      name->bytes(), name->utf8_length(),                                \
76      signature->bytes(), signature->utf8_length());                     \
77  }
78
79#define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success)       \
80  {                                                                      \
81    char* comp_name = (char*)(compiler)->name();                         \
82    Symbol* klass_name = (method)->klass_name();                         \
83    Symbol* name = (method)->name();                                     \
84    Symbol* signature = (method)->signature();                           \
85    HS_DTRACE_PROBE9(hotspot, method__compile__end,                      \
86      comp_name, strlen(comp_name),                                      \
87      klass_name->bytes(), klass_name->utf8_length(),                    \
88      name->bytes(), name->utf8_length(),                                \
89      signature->bytes(), signature->utf8_length(), (success));          \
90  }
91
92#else //  ndef DTRACE_ENABLED
93
94#define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method)
95#define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success)
96
97#endif // ndef DTRACE_ENABLED
98
99bool CompileBroker::_initialized = false;
100volatile bool CompileBroker::_should_block = false;
101volatile jint CompileBroker::_should_compile_new_jobs = run_compilation;
102
103// The installed compiler(s)
104AbstractCompiler* CompileBroker::_compilers[2];
105
106// These counters are used for assigning id's to each compilation
107uint CompileBroker::_compilation_id        = 0;
108uint CompileBroker::_osr_compilation_id    = 0;
109
110// Debugging information
111int  CompileBroker::_last_compile_type     = no_compile;
112int  CompileBroker::_last_compile_level    = CompLevel_none;
113char CompileBroker::_last_method_compiled[CompileBroker::name_buffer_length];
114
115// Performance counters
116PerfCounter* CompileBroker::_perf_total_compilation = NULL;
117PerfCounter* CompileBroker::_perf_osr_compilation = NULL;
118PerfCounter* CompileBroker::_perf_standard_compilation = NULL;
119
120PerfCounter* CompileBroker::_perf_total_bailout_count = NULL;
121PerfCounter* CompileBroker::_perf_total_invalidated_count = NULL;
122PerfCounter* CompileBroker::_perf_total_compile_count = NULL;
123PerfCounter* CompileBroker::_perf_total_osr_compile_count = NULL;
124PerfCounter* CompileBroker::_perf_total_standard_compile_count = NULL;
125
126PerfCounter* CompileBroker::_perf_sum_osr_bytes_compiled = NULL;
127PerfCounter* CompileBroker::_perf_sum_standard_bytes_compiled = NULL;
128PerfCounter* CompileBroker::_perf_sum_nmethod_size = NULL;
129PerfCounter* CompileBroker::_perf_sum_nmethod_code_size = NULL;
130
131PerfStringVariable* CompileBroker::_perf_last_method = NULL;
132PerfStringVariable* CompileBroker::_perf_last_failed_method = NULL;
133PerfStringVariable* CompileBroker::_perf_last_invalidated_method = NULL;
134PerfVariable*       CompileBroker::_perf_last_compile_type = NULL;
135PerfVariable*       CompileBroker::_perf_last_compile_size = NULL;
136PerfVariable*       CompileBroker::_perf_last_failed_type = NULL;
137PerfVariable*       CompileBroker::_perf_last_invalidated_type = NULL;
138
139// Timers and counters for generating statistics
140elapsedTimer CompileBroker::_t_total_compilation;
141elapsedTimer CompileBroker::_t_osr_compilation;
142elapsedTimer CompileBroker::_t_standard_compilation;
143
144int CompileBroker::_total_bailout_count          = 0;
145int CompileBroker::_total_invalidated_count      = 0;
146int CompileBroker::_total_compile_count          = 0;
147int CompileBroker::_total_osr_compile_count      = 0;
148int CompileBroker::_total_standard_compile_count = 0;
149
150int CompileBroker::_sum_osr_bytes_compiled       = 0;
151int CompileBroker::_sum_standard_bytes_compiled  = 0;
152int CompileBroker::_sum_nmethod_size             = 0;
153int CompileBroker::_sum_nmethod_code_size        = 0;
154
155CompileQueue* CompileBroker::_c2_method_queue   = NULL;
156CompileQueue* CompileBroker::_c1_method_queue   = NULL;
157CompileTask*  CompileBroker::_task_free_list = NULL;
158
159GrowableArray<CompilerThread*>* CompileBroker::_method_threads = NULL;
160
161
162CompileTaskWrapper::CompileTaskWrapper(CompileTask* task) {
163  CompilerThread* thread = CompilerThread::current();
164  thread->set_task(task);
165  CompileLog*     log  = thread->log();
166  if (log != NULL)  task->log_task_start(log);
167}
168
169CompileTaskWrapper::~CompileTaskWrapper() {
170  CompilerThread* thread = CompilerThread::current();
171  CompileTask* task = thread->task();
172  CompileLog*  log  = thread->log();
173  if (log != NULL)  task->log_task_done(log);
174  thread->set_task(NULL);
175  task->set_code_handle(NULL);
176  DEBUG_ONLY(thread->set_env((ciEnv*)badAddress));
177  if (task->is_blocking()) {
178    MutexLocker notifier(task->lock(), thread);
179    task->mark_complete();
180    // Notify the waiting thread that the compilation has completed.
181    task->lock()->notify_all();
182  } else {
183    task->mark_complete();
184
185    // By convention, the compiling thread is responsible for
186    // recycling a non-blocking CompileTask.
187    CompileBroker::free_task(task);
188  }
189}
190
191
192// ------------------------------------------------------------------
193// CompileTask::initialize
194void CompileTask::initialize(int compile_id,
195                             methodHandle method,
196                             int osr_bci,
197                             int comp_level,
198                             methodHandle hot_method,
199                             int hot_count,
200                             const char* comment,
201                             bool is_blocking) {
202  assert(!_lock->is_locked(), "bad locking");
203
204  _compile_id = compile_id;
205  _method = JNIHandles::make_global(method);
206  _osr_bci = osr_bci;
207  _is_blocking = is_blocking;
208  _comp_level = comp_level;
209  _num_inlined_bytecodes = 0;
210
211  _is_complete = false;
212  _is_success = false;
213  _code_handle = NULL;
214
215  _hot_method = NULL;
216  _hot_count = hot_count;
217  _time_queued = 0;  // tidy
218  _comment = comment;
219
220  if (LogCompilation) {
221    _time_queued = os::elapsed_counter();
222    if (hot_method.not_null()) {
223      if (hot_method == method) {
224        _hot_method = _method;
225      } else {
226        _hot_method = JNIHandles::make_global(hot_method);
227      }
228    }
229  }
230
231  _next = NULL;
232}
233
234// ------------------------------------------------------------------
235// CompileTask::code/set_code
236nmethod* CompileTask::code() const {
237  if (_code_handle == NULL)  return NULL;
238  return _code_handle->code();
239}
240void CompileTask::set_code(nmethod* nm) {
241  if (_code_handle == NULL && nm == NULL)  return;
242  guarantee(_code_handle != NULL, "");
243  _code_handle->set_code(nm);
244  if (nm == NULL)  _code_handle = NULL;  // drop the handle also
245}
246
247// ------------------------------------------------------------------
248// CompileTask::free
249void CompileTask::free() {
250  set_code(NULL);
251  assert(!_lock->is_locked(), "Should not be locked when freed");
252  if (_hot_method != NULL && _hot_method != _method) {
253    JNIHandles::destroy_global(_hot_method);
254  }
255  JNIHandles::destroy_global(_method);
256}
257
258
259// ------------------------------------------------------------------
260// CompileTask::print
261void CompileTask::print() {
262  tty->print("<CompileTask compile_id=%d ", _compile_id);
263  tty->print("method=");
264  ((methodOop)JNIHandles::resolve(_method))->print_name(tty);
265  tty->print_cr(" osr_bci=%d is_blocking=%s is_complete=%s is_success=%s>",
266             _osr_bci, bool_to_str(_is_blocking),
267             bool_to_str(_is_complete), bool_to_str(_is_success));
268}
269
270
271void CompileTask::print_compilation(outputStream *st, methodOop method, char* method_name) {
272  nmethod::print_compilation(st, method_name,/*title*/ NULL, method,
273                             is_blocking(), compile_id(), osr_bci(), comp_level());
274}
275
276// ------------------------------------------------------------------
277// CompileTask::print_line_on_error
278//
279// This function is called by fatal error handler when the thread
280// causing troubles is a compiler thread.
281//
282// Do not grab any lock, do not allocate memory.
283//
284// Otherwise it's the same as CompileTask::print_line()
285//
286void CompileTask::print_line_on_error(outputStream* st, char* buf, int buflen) {
287  methodOop method = (methodOop)JNIHandles::resolve(_method);
288  // print compiler name
289  st->print("%s:", CompileBroker::compiler(comp_level())->name());
290  char* method_name = NULL;
291  if (method != NULL) {
292    method_name = method->name_and_sig_as_C_string(buf, buflen);
293  }
294  print_compilation(st, method, method_name);
295}
296
297// ------------------------------------------------------------------
298// CompileTask::print_line
299void CompileTask::print_line() {
300  Thread *thread = Thread::current();
301  methodHandle method(thread,
302                      (methodOop)JNIHandles::resolve(method_handle()));
303  ResourceMark rm(thread);
304
305  ttyLocker ttyl;  // keep the following output all in one block
306
307  // print compiler name if requested
308  if (CIPrintCompilerName) tty->print("%s:", CompileBroker::compiler(comp_level())->name());
309  print_compilation(tty, method(), NULL);
310}
311
312
313// ------------------------------------------------------------------
314// CompileTask::log_task
315void CompileTask::log_task(xmlStream* log) {
316  Thread* thread = Thread::current();
317  methodHandle method(thread,
318                      (methodOop)JNIHandles::resolve(method_handle()));
319  ResourceMark rm(thread);
320
321  // <task id='9' method='M' osr_bci='X' level='1' blocking='1' stamp='1.234'>
322  if (_compile_id != 0)   log->print(" compile_id='%d'", _compile_id);
323  if (_osr_bci != CompileBroker::standard_entry_bci) {
324    log->print(" compile_kind='osr'");  // same as nmethod::compile_kind
325  } // else compile_kind='c2c'
326  if (!method.is_null())  log->method(method);
327  if (_osr_bci != CompileBroker::standard_entry_bci) {
328    log->print(" osr_bci='%d'", _osr_bci);
329  }
330  if (_comp_level != CompLevel_highest_tier) {
331    log->print(" level='%d'", _comp_level);
332  }
333  if (_is_blocking) {
334    log->print(" blocking='1'");
335  }
336  log->stamp();
337}
338
339
340// ------------------------------------------------------------------
341// CompileTask::log_task_queued
342void CompileTask::log_task_queued() {
343  Thread* thread = Thread::current();
344  ttyLocker ttyl;
345  ResourceMark rm(thread);
346
347  xtty->begin_elem("task_queued");
348  log_task(xtty);
349  if (_comment != NULL) {
350    xtty->print(" comment='%s'", _comment);
351  }
352  if (_hot_method != NULL) {
353    methodHandle hot(thread,
354                     (methodOop)JNIHandles::resolve(_hot_method));
355    methodHandle method(thread,
356                        (methodOop)JNIHandles::resolve(_method));
357    if (hot() != method()) {
358      xtty->method(hot);
359    }
360  }
361  if (_hot_count != 0) {
362    xtty->print(" hot_count='%d'", _hot_count);
363  }
364  xtty->end_elem();
365}
366
367
368// ------------------------------------------------------------------
369// CompileTask::log_task_start
370void CompileTask::log_task_start(CompileLog* log)   {
371  log->begin_head("task");
372  log_task(log);
373  log->end_head();
374}
375
376
377// ------------------------------------------------------------------
378// CompileTask::log_task_done
379void CompileTask::log_task_done(CompileLog* log) {
380  Thread* thread = Thread::current();
381  methodHandle method(thread,
382                      (methodOop)JNIHandles::resolve(method_handle()));
383  ResourceMark rm(thread);
384
385  // <task_done ... stamp='1.234'>  </task>
386  nmethod* nm = code();
387  log->begin_elem("task_done success='%d' nmsize='%d' count='%d'",
388                  _is_success, nm == NULL ? 0 : nm->content_size(),
389                  method->invocation_count());
390  int bec = method->backedge_count();
391  if (bec != 0)  log->print(" backedge_count='%d'", bec);
392  // Note:  "_is_complete" is about to be set, but is not.
393  if (_num_inlined_bytecodes != 0) {
394    log->print(" inlined_bytes='%d'", _num_inlined_bytecodes);
395  }
396  log->stamp();
397  log->end_elem();
398  log->tail("task");
399  log->clear_identities();   // next task will have different CI
400  if (log->unflushed_count() > 2000) {
401    log->flush();
402  }
403  log->mark_file_end();
404}
405
406
407
408// ------------------------------------------------------------------
409// CompileQueue::add
410//
411// Add a CompileTask to a CompileQueue
412void CompileQueue::add(CompileTask* task) {
413  assert(lock()->owned_by_self(), "must own lock");
414
415  task->set_next(NULL);
416  task->set_prev(NULL);
417
418  if (_last == NULL) {
419    // The compile queue is empty.
420    assert(_first == NULL, "queue is empty");
421    _first = task;
422    _last = task;
423  } else {
424    // Append the task to the queue.
425    assert(_last->next() == NULL, "not last");
426    _last->set_next(task);
427    task->set_prev(_last);
428    _last = task;
429  }
430  ++_size;
431
432  // Mark the method as being in the compile queue.
433  ((methodOop)JNIHandles::resolve(task->method_handle()))->set_queued_for_compilation();
434
435  if (CIPrintCompileQueue) {
436    print();
437  }
438
439  if (LogCompilation && xtty != NULL) {
440    task->log_task_queued();
441  }
442
443  // Notify CompilerThreads that a task is available.
444  lock()->notify_all();
445}
446
447// ------------------------------------------------------------------
448// CompileQueue::get
449//
450// Get the next CompileTask from a CompileQueue
451CompileTask* CompileQueue::get() {
452  NMethodSweeper::possibly_sweep();
453
454  MutexLocker locker(lock());
455  // Wait for an available CompileTask.
456  while (_first == NULL) {
457    // There is no work to be done right now.  Wait.
458    if (UseCodeCacheFlushing && (!CompileBroker::should_compile_new_jobs() || CodeCache::needs_flushing())) {
459      // During the emergency sweeping periods, wake up and sweep occasionally
460      bool timedout = lock()->wait(!Mutex::_no_safepoint_check_flag, NmethodSweepCheckInterval*1000);
461      if (timedout) {
462        MutexUnlocker ul(lock());
463        // When otherwise not busy, run nmethod sweeping
464        NMethodSweeper::possibly_sweep();
465      }
466    } else {
467      // During normal operation no need to wake up on timer
468      lock()->wait();
469    }
470  }
471  CompileTask* task = CompilationPolicy::policy()->select_task(this);
472  remove(task);
473  return task;
474}
475
476void CompileQueue::remove(CompileTask* task)
477{
478   assert(lock()->owned_by_self(), "must own lock");
479  if (task->prev() != NULL) {
480    task->prev()->set_next(task->next());
481  } else {
482    // max is the first element
483    assert(task == _first, "Sanity");
484    _first = task->next();
485  }
486
487  if (task->next() != NULL) {
488    task->next()->set_prev(task->prev());
489  } else {
490    // max is the last element
491    assert(task == _last, "Sanity");
492    _last = task->prev();
493  }
494  --_size;
495}
496
497// ------------------------------------------------------------------
498// CompileQueue::print
499void CompileQueue::print() {
500  tty->print_cr("Contents of %s", name());
501  tty->print_cr("----------------------");
502  CompileTask* task = _first;
503  while (task != NULL) {
504    task->print_line();
505    task = task->next();
506  }
507  tty->print_cr("----------------------");
508}
509
510CompilerCounters::CompilerCounters(const char* thread_name, int instance, TRAPS) {
511
512  _current_method[0] = '\0';
513  _compile_type = CompileBroker::no_compile;
514
515  if (UsePerfData) {
516    ResourceMark rm;
517
518    // create the thread instance name space string - don't create an
519    // instance subspace if instance is -1 - keeps the adapterThread
520    // counters  from having a ".0" namespace.
521    const char* thread_i = (instance == -1) ? thread_name :
522                      PerfDataManager::name_space(thread_name, instance);
523
524
525    char* name = PerfDataManager::counter_name(thread_i, "method");
526    _perf_current_method =
527               PerfDataManager::create_string_variable(SUN_CI, name,
528                                                       cmname_buffer_length,
529                                                       _current_method, CHECK);
530
531    name = PerfDataManager::counter_name(thread_i, "type");
532    _perf_compile_type = PerfDataManager::create_variable(SUN_CI, name,
533                                                          PerfData::U_None,
534                                                         (jlong)_compile_type,
535                                                          CHECK);
536
537    name = PerfDataManager::counter_name(thread_i, "time");
538    _perf_time = PerfDataManager::create_counter(SUN_CI, name,
539                                                 PerfData::U_Ticks, CHECK);
540
541    name = PerfDataManager::counter_name(thread_i, "compiles");
542    _perf_compiles = PerfDataManager::create_counter(SUN_CI, name,
543                                                     PerfData::U_Events, CHECK);
544  }
545}
546
547// ------------------------------------------------------------------
548// CompileBroker::compilation_init
549//
550// Initialize the Compilation object
551void CompileBroker::compilation_init() {
552  _last_method_compiled[0] = '\0';
553
554#ifndef SHARK
555  // Set the interface to the current compiler(s).
556  int c1_count = CompilationPolicy::policy()->compiler_count(CompLevel_simple);
557  int c2_count = CompilationPolicy::policy()->compiler_count(CompLevel_full_optimization);
558#ifdef COMPILER1
559  if (c1_count > 0) {
560    _compilers[0] = new Compiler();
561  }
562#endif // COMPILER1
563
564#ifdef COMPILER2
565  if (c2_count > 0) {
566    _compilers[1] = new C2Compiler();
567  }
568#endif // COMPILER2
569
570#else // SHARK
571  int c1_count = 0;
572  int c2_count = 1;
573
574  _compilers[1] = new SharkCompiler();
575#endif // SHARK
576
577  // Initialize the CompileTask free list
578  _task_free_list = NULL;
579
580  // Start the CompilerThreads
581  init_compiler_threads(c1_count, c2_count);
582  // totalTime performance counter is always created as it is required
583  // by the implementation of java.lang.management.CompilationMBean.
584  {
585    EXCEPTION_MARK;
586    _perf_total_compilation =
587                 PerfDataManager::create_counter(JAVA_CI, "totalTime",
588                                                 PerfData::U_Ticks, CHECK);
589  }
590
591
592  if (UsePerfData) {
593
594    EXCEPTION_MARK;
595
596    // create the jvmstat performance counters
597    _perf_osr_compilation =
598                 PerfDataManager::create_counter(SUN_CI, "osrTime",
599                                                 PerfData::U_Ticks, CHECK);
600
601    _perf_standard_compilation =
602                 PerfDataManager::create_counter(SUN_CI, "standardTime",
603                                                 PerfData::U_Ticks, CHECK);
604
605    _perf_total_bailout_count =
606                 PerfDataManager::create_counter(SUN_CI, "totalBailouts",
607                                                 PerfData::U_Events, CHECK);
608
609    _perf_total_invalidated_count =
610                 PerfDataManager::create_counter(SUN_CI, "totalInvalidates",
611                                                 PerfData::U_Events, CHECK);
612
613    _perf_total_compile_count =
614                 PerfDataManager::create_counter(SUN_CI, "totalCompiles",
615                                                 PerfData::U_Events, CHECK);
616    _perf_total_osr_compile_count =
617                 PerfDataManager::create_counter(SUN_CI, "osrCompiles",
618                                                 PerfData::U_Events, CHECK);
619
620    _perf_total_standard_compile_count =
621                 PerfDataManager::create_counter(SUN_CI, "standardCompiles",
622                                                 PerfData::U_Events, CHECK);
623
624    _perf_sum_osr_bytes_compiled =
625                 PerfDataManager::create_counter(SUN_CI, "osrBytes",
626                                                 PerfData::U_Bytes, CHECK);
627
628    _perf_sum_standard_bytes_compiled =
629                 PerfDataManager::create_counter(SUN_CI, "standardBytes",
630                                                 PerfData::U_Bytes, CHECK);
631
632    _perf_sum_nmethod_size =
633                 PerfDataManager::create_counter(SUN_CI, "nmethodSize",
634                                                 PerfData::U_Bytes, CHECK);
635
636    _perf_sum_nmethod_code_size =
637                 PerfDataManager::create_counter(SUN_CI, "nmethodCodeSize",
638                                                 PerfData::U_Bytes, CHECK);
639
640    _perf_last_method =
641                 PerfDataManager::create_string_variable(SUN_CI, "lastMethod",
642                                       CompilerCounters::cmname_buffer_length,
643                                       "", CHECK);
644
645    _perf_last_failed_method =
646            PerfDataManager::create_string_variable(SUN_CI, "lastFailedMethod",
647                                       CompilerCounters::cmname_buffer_length,
648                                       "", CHECK);
649
650    _perf_last_invalidated_method =
651        PerfDataManager::create_string_variable(SUN_CI, "lastInvalidatedMethod",
652                                     CompilerCounters::cmname_buffer_length,
653                                     "", CHECK);
654
655    _perf_last_compile_type =
656             PerfDataManager::create_variable(SUN_CI, "lastType",
657                                              PerfData::U_None,
658                                              (jlong)CompileBroker::no_compile,
659                                              CHECK);
660
661    _perf_last_compile_size =
662             PerfDataManager::create_variable(SUN_CI, "lastSize",
663                                              PerfData::U_Bytes,
664                                              (jlong)CompileBroker::no_compile,
665                                              CHECK);
666
667
668    _perf_last_failed_type =
669             PerfDataManager::create_variable(SUN_CI, "lastFailedType",
670                                              PerfData::U_None,
671                                              (jlong)CompileBroker::no_compile,
672                                              CHECK);
673
674    _perf_last_invalidated_type =
675         PerfDataManager::create_variable(SUN_CI, "lastInvalidatedType",
676                                          PerfData::U_None,
677                                          (jlong)CompileBroker::no_compile,
678                                          CHECK);
679  }
680
681  _initialized = true;
682}
683
684
685
686// ------------------------------------------------------------------
687// CompileBroker::make_compiler_thread
688CompilerThread* CompileBroker::make_compiler_thread(const char* name, CompileQueue* queue, CompilerCounters* counters, TRAPS) {
689  CompilerThread* compiler_thread = NULL;
690
691  klassOop k =
692    SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(),
693                                      true, CHECK_0);
694  instanceKlassHandle klass (THREAD, k);
695  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_0);
696  Handle string = java_lang_String::create_from_str(name, CHECK_0);
697
698  // Initialize thread_oop to put it into the system threadGroup
699  Handle thread_group (THREAD,  Universe::system_thread_group());
700  JavaValue result(T_VOID);
701  JavaCalls::call_special(&result, thread_oop,
702                       klass,
703                       vmSymbols::object_initializer_name(),
704                       vmSymbols::threadgroup_string_void_signature(),
705                       thread_group,
706                       string,
707                       CHECK_0);
708
709  {
710    MutexLocker mu(Threads_lock, THREAD);
711    compiler_thread = new CompilerThread(queue, counters);
712    // At this point the new CompilerThread data-races with this startup
713    // thread (which I believe is the primoridal thread and NOT the VM
714    // thread).  This means Java bytecodes being executed at startup can
715    // queue compile jobs which will run at whatever default priority the
716    // newly created CompilerThread runs at.
717
718
719    // At this point it may be possible that no osthread was created for the
720    // JavaThread due to lack of memory. We would have to throw an exception
721    // in that case. However, since this must work and we do not allow
722    // exceptions anyway, check and abort if this fails.
723
724    if (compiler_thread == NULL || compiler_thread->osthread() == NULL){
725      vm_exit_during_initialization("java.lang.OutOfMemoryError",
726                                    "unable to create new native thread");
727    }
728
729    java_lang_Thread::set_thread(thread_oop(), compiler_thread);
730
731    // Note that this only sets the JavaThread _priority field, which by
732    // definition is limited to Java priorities and not OS priorities.
733    // The os-priority is set in the CompilerThread startup code itself
734    java_lang_Thread::set_priority(thread_oop(), NearMaxPriority);
735    // CLEANUP PRIORITIES: This -if- statement hids a bug whereby the compiler
736    // threads never have their OS priority set.  The assumption here is to
737    // enable the Performance group to do flag tuning, figure out a suitable
738    // CompilerThreadPriority, and then remove this 'if' statement (and
739    // comment) and unconditionally set the priority.
740
741    // Compiler Threads should be at the highest Priority
742    if ( CompilerThreadPriority != -1 )
743      os::set_native_priority( compiler_thread, CompilerThreadPriority );
744    else
745      os::set_native_priority( compiler_thread, os::java_to_os_priority[NearMaxPriority]);
746
747      // Note that I cannot call os::set_priority because it expects Java
748      // priorities and I am *explicitly* using OS priorities so that it's
749      // possible to set the compiler thread priority higher than any Java
750      // thread.
751
752    java_lang_Thread::set_daemon(thread_oop());
753
754    compiler_thread->set_threadObj(thread_oop());
755    Threads::add(compiler_thread);
756    Thread::start(compiler_thread);
757  }
758  // Let go of Threads_lock before yielding
759  os::yield(); // make sure that the compiler thread is started early (especially helpful on SOLARIS)
760
761  return compiler_thread;
762}
763
764
765// ------------------------------------------------------------------
766// CompileBroker::init_compiler_threads
767//
768// Initialize the compilation queue
769void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler_count) {
770  EXCEPTION_MARK;
771#ifndef ZERO
772  assert(c2_compiler_count > 0 || c1_compiler_count > 0, "No compilers?");
773#endif // !ZERO
774  if (c2_compiler_count > 0) {
775    _c2_method_queue  = new CompileQueue("C2MethodQueue",  MethodCompileQueue_lock);
776  }
777  if (c1_compiler_count > 0) {
778    _c1_method_queue  = new CompileQueue("C1MethodQueue",  MethodCompileQueue_lock);
779  }
780
781  int compiler_count = c1_compiler_count + c2_compiler_count;
782
783  _method_threads =
784    new (ResourceObj::C_HEAP) GrowableArray<CompilerThread*>(compiler_count, true);
785
786  char name_buffer[256];
787  for (int i = 0; i < c2_compiler_count; i++) {
788    // Create a name for our thread.
789    sprintf(name_buffer, "C2 CompilerThread%d", i);
790    CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK);
791    CompilerThread* new_thread = make_compiler_thread(name_buffer, _c2_method_queue, counters, CHECK);
792    _method_threads->append(new_thread);
793  }
794
795  for (int i = c2_compiler_count; i < compiler_count; i++) {
796    // Create a name for our thread.
797    sprintf(name_buffer, "C1 CompilerThread%d", i);
798    CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK);
799    CompilerThread* new_thread = make_compiler_thread(name_buffer, _c1_method_queue, counters, CHECK);
800    _method_threads->append(new_thread);
801  }
802
803  if (UsePerfData) {
804    PerfDataManager::create_constant(SUN_CI, "threads", PerfData::U_Bytes,
805                                     compiler_count, CHECK);
806  }
807}
808
809// ------------------------------------------------------------------
810// CompileBroker::is_idle
811bool CompileBroker::is_idle() {
812  if (_c2_method_queue != NULL && !_c2_method_queue->is_empty()) {
813    return false;
814  } else if (_c1_method_queue != NULL && !_c1_method_queue->is_empty()) {
815    return false;
816  } else {
817    int num_threads = _method_threads->length();
818    for (int i=0; i<num_threads; i++) {
819      if (_method_threads->at(i)->task() != NULL) {
820        return false;
821      }
822    }
823
824    // No pending or active compilations.
825    return true;
826  }
827}
828
829
830// ------------------------------------------------------------------
831// CompileBroker::compile_method
832//
833// Request compilation of a method.
834void CompileBroker::compile_method_base(methodHandle method,
835                                        int osr_bci,
836                                        int comp_level,
837                                        methodHandle hot_method,
838                                        int hot_count,
839                                        const char* comment,
840                                        TRAPS) {
841  // do nothing if compiler thread(s) is not available
842  if (!_initialized ) {
843    return;
844  }
845
846  guarantee(!method->is_abstract(), "cannot compile abstract methods");
847  assert(method->method_holder()->klass_part()->oop_is_instance(),
848         "sanity check");
849  assert(!instanceKlass::cast(method->method_holder())->is_not_initialized(),
850         "method holder must be initialized");
851
852  if (CIPrintRequests) {
853    tty->print("request: ");
854    method->print_short_name(tty);
855    if (osr_bci != InvocationEntryBci) {
856      tty->print(" osr_bci: %d", osr_bci);
857    }
858    tty->print(" comment: %s count: %d", comment, hot_count);
859    if (!hot_method.is_null()) {
860      tty->print(" hot: ");
861      if (hot_method() != method()) {
862          hot_method->print_short_name(tty);
863      } else {
864        tty->print("yes");
865      }
866    }
867    tty->cr();
868  }
869
870  // A request has been made for compilation.  Before we do any
871  // real work, check to see if the method has been compiled
872  // in the meantime with a definitive result.
873  if (compilation_is_complete(method, osr_bci, comp_level)) {
874    return;
875  }
876
877
878  // If this method is already in the compile queue, then
879  // we do not block the current thread.
880  if (compilation_is_in_queue(method, osr_bci)) {
881    // We may want to decay our counter a bit here to prevent
882    // multiple denied requests for compilation.  This is an
883    // open compilation policy issue. Note: The other possibility,
884    // in the case that this is a blocking compile request, is to have
885    // all subsequent blocking requesters wait for completion of
886    // ongoing compiles. Note that in this case we'll need a protocol
887    // for freeing the associated compile tasks. [Or we could have
888    // a single static monitor on which all these waiters sleep.]
889    return;
890  }
891
892  // Outputs from the following MutexLocker block:
893  CompileTask* task     = NULL;
894  bool         blocking = false;
895  CompileQueue* queue  = compile_queue(comp_level);
896
897  // Acquire our lock.
898  {
899    MutexLocker locker(queue->lock(), THREAD);
900
901    // Make sure the method has not slipped into the queues since
902    // last we checked; note that those checks were "fast bail-outs".
903    // Here we need to be more careful, see 14012000 below.
904    if (compilation_is_in_queue(method, osr_bci)) {
905      return;
906    }
907
908    // We need to check again to see if the compilation has
909    // completed.  A previous compilation may have registered
910    // some result.
911    if (compilation_is_complete(method, osr_bci, comp_level)) {
912      return;
913    }
914
915    // We now know that this compilation is not pending, complete,
916    // or prohibited.  Assign a compile_id to this compilation
917    // and check to see if it is in our [Start..Stop) range.
918    uint compile_id = assign_compile_id(method, osr_bci);
919    if (compile_id == 0) {
920      // The compilation falls outside the allowed range.
921      return;
922    }
923
924    // Should this thread wait for completion of the compile?
925    blocking = is_compile_blocking(method, osr_bci);
926
927    // We will enter the compilation in the queue.
928    // 14012000: Note that this sets the queued_for_compile bits in
929    // the target method. We can now reason that a method cannot be
930    // queued for compilation more than once, as follows:
931    // Before a thread queues a task for compilation, it first acquires
932    // the compile queue lock, then checks if the method's queued bits
933    // are set or it has already been compiled. Thus there can not be two
934    // instances of a compilation task for the same method on the
935    // compilation queue. Consider now the case where the compilation
936    // thread has already removed a task for that method from the queue
937    // and is in the midst of compiling it. In this case, the
938    // queued_for_compile bits must be set in the method (and these
939    // will be visible to the current thread, since the bits were set
940    // under protection of the compile queue lock, which we hold now.
941    // When the compilation completes, the compiler thread first sets
942    // the compilation result and then clears the queued_for_compile
943    // bits. Neither of these actions are protected by a barrier (or done
944    // under the protection of a lock), so the only guarantee we have
945    // (on machines with TSO (Total Store Order)) is that these values
946    // will update in that order. As a result, the only combinations of
947    // these bits that the current thread will see are, in temporal order:
948    // <RESULT, QUEUE> :
949    //     <0, 1> : in compile queue, but not yet compiled
950    //     <1, 1> : compiled but queue bit not cleared
951    //     <1, 0> : compiled and queue bit cleared
952    // Because we first check the queue bits then check the result bits,
953    // we are assured that we cannot introduce a duplicate task.
954    // Note that if we did the tests in the reverse order (i.e. check
955    // result then check queued bit), we could get the result bit before
956    // the compilation completed, and the queue bit after the compilation
957    // completed, and end up introducing a "duplicate" (redundant) task.
958    // In that case, the compiler thread should first check if a method
959    // has already been compiled before trying to compile it.
960    // NOTE: in the event that there are multiple compiler threads and
961    // there is de-optimization/recompilation, things will get hairy,
962    // and in that case it's best to protect both the testing (here) of
963    // these bits, and their updating (here and elsewhere) under a
964    // common lock.
965    task = create_compile_task(queue,
966                               compile_id, method,
967                               osr_bci, comp_level,
968                               hot_method, hot_count, comment,
969                               blocking);
970  }
971
972  if (blocking) {
973    wait_for_completion(task);
974  }
975}
976
977
978nmethod* CompileBroker::compile_method(methodHandle method, int osr_bci,
979                                       int comp_level,
980                                       methodHandle hot_method, int hot_count,
981                                       const char* comment, TRAPS) {
982  // make sure arguments make sense
983  assert(method->method_holder()->klass_part()->oop_is_instance(), "not an instance method");
984  assert(osr_bci == InvocationEntryBci || (0 <= osr_bci && osr_bci < method->code_size()), "bci out of range");
985  assert(!method->is_abstract() && (osr_bci == InvocationEntryBci || !method->is_native()), "cannot compile abstract/native methods");
986  assert(!instanceKlass::cast(method->method_holder())->is_not_initialized(), "method holder must be initialized");
987
988  if (!TieredCompilation) {
989    comp_level = CompLevel_highest_tier;
990  }
991
992  // return quickly if possible
993
994  // lock, make sure that the compilation
995  // isn't prohibited in a straightforward way.
996
997  if (compiler(comp_level) == NULL || compilation_is_prohibited(method, osr_bci, comp_level)) {
998    return NULL;
999  }
1000
1001  if (osr_bci == InvocationEntryBci) {
1002    // standard compilation
1003    nmethod* method_code = method->code();
1004    if (method_code != NULL) {
1005      if (compilation_is_complete(method, osr_bci, comp_level)) {
1006        return method_code;
1007      }
1008    }
1009    if (method->is_not_compilable(comp_level)) return NULL;
1010
1011    if (UseCodeCacheFlushing) {
1012      nmethod* saved = CodeCache::find_and_remove_saved_code(method());
1013      if (saved != NULL) {
1014        method->set_code(method, saved);
1015        return saved;
1016      }
1017    }
1018
1019  } else {
1020    // osr compilation
1021#ifndef TIERED
1022    // seems like an assert of dubious value
1023    assert(comp_level == CompLevel_highest_tier,
1024           "all OSR compiles are assumed to be at a single compilation lavel");
1025#endif // TIERED
1026    // We accept a higher level osr method
1027    nmethod* nm = method->lookup_osr_nmethod_for(osr_bci, comp_level, false);
1028    if (nm != NULL) return nm;
1029    if (method->is_not_osr_compilable()) return NULL;
1030  }
1031
1032  assert(!HAS_PENDING_EXCEPTION, "No exception should be present");
1033  // some prerequisites that are compiler specific
1034  if (compiler(comp_level)->is_c2()) {
1035    method->constants()->resolve_string_constants(CHECK_0);
1036    // Resolve all classes seen in the signature of the method
1037    // we are compiling.
1038    methodOopDesc::load_signature_classes(method, CHECK_0);
1039  }
1040
1041  // If the method is native, do the lookup in the thread requesting
1042  // the compilation. Native lookups can load code, which is not
1043  // permitted during compilation.
1044  //
1045  // Note: A native method implies non-osr compilation which is
1046  //       checked with an assertion at the entry of this method.
1047  if (method->is_native()) {
1048    bool in_base_library;
1049    address adr = NativeLookup::lookup(method, in_base_library, THREAD);
1050    if (HAS_PENDING_EXCEPTION) {
1051      // In case of an exception looking up the method, we just forget
1052      // about it. The interpreter will kick-in and throw the exception.
1053      method->set_not_compilable(); // implies is_not_osr_compilable()
1054      CLEAR_PENDING_EXCEPTION;
1055      return NULL;
1056    }
1057    assert(method->has_native_function(), "must have native code by now");
1058  }
1059
1060  // RedefineClasses() has replaced this method; just return
1061  if (method->is_old()) {
1062    return NULL;
1063  }
1064
1065  // JVMTI -- post_compile_event requires jmethod_id() that may require
1066  // a lock the compiling thread can not acquire. Prefetch it here.
1067  if (JvmtiExport::should_post_compiled_method_load()) {
1068    method->jmethod_id();
1069  }
1070
1071  // If the compiler is shut off due to code cache flushing or otherwise,
1072  // fail out now so blocking compiles dont hang the java thread
1073  if (!should_compile_new_jobs() || (UseCodeCacheFlushing && CodeCache::needs_flushing())) {
1074    CompilationPolicy::policy()->delay_compilation(method());
1075    return NULL;
1076  }
1077
1078  // do the compilation
1079  if (method->is_native()) {
1080    if (!PreferInterpreterNativeStubs) {
1081      (void) AdapterHandlerLibrary::create_native_wrapper(method);
1082    } else {
1083      return NULL;
1084    }
1085  } else {
1086    compile_method_base(method, osr_bci, comp_level, hot_method, hot_count, comment, CHECK_0);
1087  }
1088
1089  // return requested nmethod
1090  // We accept a higher level osr method
1091  return osr_bci  == InvocationEntryBci ? method->code() : method->lookup_osr_nmethod_for(osr_bci, comp_level, false);
1092}
1093
1094
1095// ------------------------------------------------------------------
1096// CompileBroker::compilation_is_complete
1097//
1098// See if compilation of this method is already complete.
1099bool CompileBroker::compilation_is_complete(methodHandle method,
1100                                            int          osr_bci,
1101                                            int          comp_level) {
1102  bool is_osr = (osr_bci != standard_entry_bci);
1103  if (is_osr) {
1104    if (method->is_not_osr_compilable()) {
1105      return true;
1106    } else {
1107      nmethod* result = method->lookup_osr_nmethod_for(osr_bci, comp_level, true);
1108      return (result != NULL);
1109    }
1110  } else {
1111    if (method->is_not_compilable(comp_level)) {
1112      return true;
1113    } else {
1114      nmethod* result = method->code();
1115      if (result == NULL) return false;
1116      return comp_level == result->comp_level();
1117    }
1118  }
1119}
1120
1121
1122// ------------------------------------------------------------------
1123// CompileBroker::compilation_is_in_queue
1124//
1125// See if this compilation is already requested.
1126//
1127// Implementation note: there is only a single "is in queue" bit
1128// for each method.  This means that the check below is overly
1129// conservative in the sense that an osr compilation in the queue
1130// will block a normal compilation from entering the queue (and vice
1131// versa).  This can be remedied by a full queue search to disambiguate
1132// cases.  If it is deemed profitible, this may be done.
1133bool CompileBroker::compilation_is_in_queue(methodHandle method,
1134                                            int          osr_bci) {
1135  return method->queued_for_compilation();
1136}
1137
1138// ------------------------------------------------------------------
1139// CompileBroker::compilation_is_prohibited
1140//
1141// See if this compilation is not allowed.
1142bool CompileBroker::compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level) {
1143  bool is_native = method->is_native();
1144  // Some compilers may not support the compilation of natives.
1145  if (is_native &&
1146      (!CICompileNatives || !compiler(comp_level)->supports_native())) {
1147    method->set_not_compilable_quietly(comp_level);
1148    return true;
1149  }
1150
1151  bool is_osr = (osr_bci != standard_entry_bci);
1152  // Some compilers may not support on stack replacement.
1153  if (is_osr &&
1154      (!CICompileOSR || !compiler(comp_level)->supports_osr())) {
1155    method->set_not_osr_compilable();
1156    return true;
1157  }
1158
1159  // The method may be explicitly excluded by the user.
1160  bool quietly;
1161  if (CompilerOracle::should_exclude(method, quietly)) {
1162    if (!quietly) {
1163      // This does not happen quietly...
1164      ResourceMark rm;
1165      tty->print("### Excluding %s:%s",
1166                 method->is_native() ? "generation of native wrapper" : "compile",
1167                 (method->is_static() ? " static" : ""));
1168      method->print_short_name(tty);
1169      tty->cr();
1170    }
1171    method->set_not_compilable_quietly();
1172  }
1173
1174  return false;
1175}
1176
1177
1178// ------------------------------------------------------------------
1179// CompileBroker::assign_compile_id
1180//
1181// Assign a serialized id number to this compilation request.  If the
1182// number falls out of the allowed range, return a 0.  OSR
1183// compilations may be numbered separately from regular compilations
1184// if certain debugging flags are used.
1185uint CompileBroker::assign_compile_id(methodHandle method, int osr_bci) {
1186  assert(MethodCompileQueue_lock->owner() == Thread::current(),
1187         "must hold the compilation queue lock");
1188  bool is_osr = (osr_bci != standard_entry_bci);
1189  assert(!method->is_native(), "no longer compile natives");
1190  uint id;
1191  if (CICountOSR && is_osr) {
1192    id = ++_osr_compilation_id;
1193    if ((uint)CIStartOSR <= id && id < (uint)CIStopOSR) {
1194      return id;
1195    }
1196  } else {
1197    id = ++_compilation_id;
1198    if ((uint)CIStart <= id && id < (uint)CIStop) {
1199      return id;
1200    }
1201  }
1202
1203  // Method was not in the appropriate compilation range.
1204  method->set_not_compilable_quietly();
1205  return 0;
1206}
1207
1208
1209// ------------------------------------------------------------------
1210// CompileBroker::is_compile_blocking
1211//
1212// Should the current thread be blocked until this compilation request
1213// has been fulfilled?
1214bool CompileBroker::is_compile_blocking(methodHandle method, int osr_bci) {
1215  if (!BackgroundCompilation) {
1216    Symbol* class_name = method->method_holder()->klass_part()->name();
1217    if (class_name->starts_with("java/lang/ref/Reference", 23)) {
1218      // The reference handler thread can dead lock with the GC if compilation is blocking,
1219      // so we avoid blocking compiles for anything in the java.lang.ref.Reference class,
1220      // including inner classes such as ReferenceHandler.
1221      return false;
1222    }
1223    return true;
1224  }
1225  return false;
1226}
1227
1228
1229// ------------------------------------------------------------------
1230// CompileBroker::preload_classes
1231void CompileBroker::preload_classes(methodHandle method, TRAPS) {
1232  // Move this code over from c1_Compiler.cpp
1233  ShouldNotReachHere();
1234}
1235
1236
1237// ------------------------------------------------------------------
1238// CompileBroker::create_compile_task
1239//
1240// Create a CompileTask object representing the current request for
1241// compilation.  Add this task to the queue.
1242CompileTask* CompileBroker::create_compile_task(CompileQueue* queue,
1243                                              int           compile_id,
1244                                              methodHandle  method,
1245                                              int           osr_bci,
1246                                              int           comp_level,
1247                                              methodHandle  hot_method,
1248                                              int           hot_count,
1249                                              const char*   comment,
1250                                              bool          blocking) {
1251  CompileTask* new_task = allocate_task();
1252  new_task->initialize(compile_id, method, osr_bci, comp_level,
1253                       hot_method, hot_count, comment,
1254                       blocking);
1255  queue->add(new_task);
1256  return new_task;
1257}
1258
1259
1260// ------------------------------------------------------------------
1261// CompileBroker::allocate_task
1262//
1263// Allocate a CompileTask, from the free list if possible.
1264CompileTask* CompileBroker::allocate_task() {
1265  MutexLocker locker(CompileTaskAlloc_lock);
1266  CompileTask* task = NULL;
1267  if (_task_free_list != NULL) {
1268    task = _task_free_list;
1269    _task_free_list = task->next();
1270    task->set_next(NULL);
1271  } else {
1272    task = new CompileTask();
1273    task->set_next(NULL);
1274  }
1275  return task;
1276}
1277
1278
1279// ------------------------------------------------------------------
1280// CompileBroker::free_task
1281//
1282// Add a task to the free list.
1283void CompileBroker::free_task(CompileTask* task) {
1284  MutexLocker locker(CompileTaskAlloc_lock);
1285  task->free();
1286  task->set_next(_task_free_list);
1287  _task_free_list = task;
1288}
1289
1290
1291// ------------------------------------------------------------------
1292// CompileBroker::wait_for_completion
1293//
1294// Wait for the given method CompileTask to complete.
1295void CompileBroker::wait_for_completion(CompileTask* task) {
1296  if (CIPrintCompileQueue) {
1297    tty->print_cr("BLOCKING FOR COMPILE");
1298  }
1299
1300  assert(task->is_blocking(), "can only wait on blocking task");
1301
1302  JavaThread *thread = JavaThread::current();
1303  thread->set_blocked_on_compilation(true);
1304
1305  methodHandle method(thread,
1306                      (methodOop)JNIHandles::resolve(task->method_handle()));
1307  {
1308    MutexLocker waiter(task->lock(), thread);
1309
1310    while (!task->is_complete())
1311      task->lock()->wait();
1312  }
1313  // It is harmless to check this status without the lock, because
1314  // completion is a stable property (until the task object is recycled).
1315  assert(task->is_complete(), "Compilation should have completed");
1316  assert(task->code_handle() == NULL, "must be reset");
1317
1318  thread->set_blocked_on_compilation(false);
1319
1320  // By convention, the waiter is responsible for recycling a
1321  // blocking CompileTask. Since there is only one waiter ever
1322  // waiting on a CompileTask, we know that no one else will
1323  // be using this CompileTask; we can free it.
1324  free_task(task);
1325}
1326
1327// ------------------------------------------------------------------
1328// CompileBroker::compiler_thread_loop
1329//
1330// The main loop run by a CompilerThread.
1331void CompileBroker::compiler_thread_loop() {
1332  CompilerThread* thread = CompilerThread::current();
1333  CompileQueue* queue = thread->queue();
1334
1335  // For the thread that initializes the ciObjectFactory
1336  // this resource mark holds all the shared objects
1337  ResourceMark rm;
1338
1339  // First thread to get here will initialize the compiler interface
1340
1341  if (!ciObjectFactory::is_initialized()) {
1342    ASSERT_IN_VM;
1343    MutexLocker only_one (CompileThread_lock, thread);
1344    if (!ciObjectFactory::is_initialized()) {
1345      ciObjectFactory::initialize();
1346    }
1347  }
1348
1349  // Open a log.
1350  if (LogCompilation) {
1351    init_compiler_thread_log();
1352  }
1353  CompileLog* log = thread->log();
1354  if (log != NULL) {
1355    log->begin_elem("start_compile_thread thread='" UINTX_FORMAT "' process='%d'",
1356                    os::current_thread_id(),
1357                    os::current_process_id());
1358    log->stamp();
1359    log->end_elem();
1360  }
1361
1362  while (true) {
1363    {
1364      // We need this HandleMark to avoid leaking VM handles.
1365      HandleMark hm(thread);
1366
1367      if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) {
1368        // the code cache is really full
1369        handle_full_code_cache();
1370      } else if (UseCodeCacheFlushing && CodeCache::needs_flushing()) {
1371        // Attempt to start cleaning the code cache while there is still a little headroom
1372        NMethodSweeper::handle_full_code_cache(false);
1373      }
1374
1375      CompileTask* task = queue->get();
1376
1377      // Give compiler threads an extra quanta.  They tend to be bursty and
1378      // this helps the compiler to finish up the job.
1379      if( CompilerThreadHintNoPreempt )
1380        os::hint_no_preempt();
1381
1382      // trace per thread time and compile statistics
1383      CompilerCounters* counters = ((CompilerThread*)thread)->counters();
1384      PerfTraceTimedEvent(counters->time_counter(), counters->compile_counter());
1385
1386      // Assign the task to the current thread.  Mark this compilation
1387      // thread as active for the profiler.
1388      CompileTaskWrapper ctw(task);
1389      nmethodLocker result_handle;  // (handle for the nmethod produced by this task)
1390      task->set_code_handle(&result_handle);
1391      methodHandle method(thread,
1392                     (methodOop)JNIHandles::resolve(task->method_handle()));
1393
1394      // Never compile a method if breakpoints are present in it
1395      if (method()->number_of_breakpoints() == 0) {
1396        // Compile the method.
1397        if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
1398#ifdef COMPILER1
1399          // Allow repeating compilations for the purpose of benchmarking
1400          // compile speed. This is not useful for customers.
1401          if (CompilationRepeat != 0) {
1402            int compile_count = CompilationRepeat;
1403            while (compile_count > 0) {
1404              invoke_compiler_on_method(task);
1405              nmethod* nm = method->code();
1406              if (nm != NULL) {
1407                nm->make_zombie();
1408                method->clear_code();
1409              }
1410              compile_count--;
1411            }
1412          }
1413#endif /* COMPILER1 */
1414          invoke_compiler_on_method(task);
1415        } else {
1416          // After compilation is disabled, remove remaining methods from queue
1417          method->clear_queued_for_compilation();
1418        }
1419      }
1420    }
1421  }
1422}
1423
1424
1425// ------------------------------------------------------------------
1426// CompileBroker::init_compiler_thread_log
1427//
1428// Set up state required by +LogCompilation.
1429void CompileBroker::init_compiler_thread_log() {
1430    CompilerThread* thread = CompilerThread::current();
1431    char  fileBuf[4*K];
1432    FILE* fp = NULL;
1433    char* file = NULL;
1434    intx thread_id = os::current_thread_id();
1435    for (int try_temp_dir = 1; try_temp_dir >= 0; try_temp_dir--) {
1436      const char* dir = (try_temp_dir ? os::get_temp_directory() : NULL);
1437      if (dir == NULL) {
1438        jio_snprintf(fileBuf, sizeof(fileBuf), "hs_c" UINTX_FORMAT "_pid%u.log",
1439                     thread_id, os::current_process_id());
1440      } else {
1441        jio_snprintf(fileBuf, sizeof(fileBuf),
1442                     "%s%shs_c" UINTX_FORMAT "_pid%u.log", dir,
1443                     os::file_separator(), thread_id, os::current_process_id());
1444      }
1445      fp = fopen(fileBuf, "at");
1446      if (fp != NULL) {
1447        file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1);
1448        strcpy(file, fileBuf);
1449        break;
1450      }
1451    }
1452    if (fp == NULL) {
1453      warning("Cannot open log file: %s", fileBuf);
1454    } else {
1455      if (LogCompilation && Verbose)
1456        tty->print_cr("Opening compilation log %s", file);
1457      CompileLog* log = new(ResourceObj::C_HEAP) CompileLog(file, fp, thread_id);
1458      thread->init_log(log);
1459
1460      if (xtty != NULL) {
1461        ttyLocker ttyl;
1462
1463        // Record any per thread log files
1464        xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file);
1465      }
1466    }
1467}
1468
1469// ------------------------------------------------------------------
1470// CompileBroker::set_should_block
1471//
1472// Set _should_block.
1473// Call this from the VM, with Threads_lock held and a safepoint requested.
1474void CompileBroker::set_should_block() {
1475  assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
1476  assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint already");
1477#ifndef PRODUCT
1478  if (PrintCompilation && (Verbose || WizardMode))
1479    tty->print_cr("notifying compiler thread pool to block");
1480#endif
1481  _should_block = true;
1482}
1483
1484// ------------------------------------------------------------------
1485// CompileBroker::maybe_block
1486//
1487// Call this from the compiler at convenient points, to poll for _should_block.
1488void CompileBroker::maybe_block() {
1489  if (_should_block) {
1490#ifndef PRODUCT
1491    if (PrintCompilation && (Verbose || WizardMode))
1492      tty->print_cr("compiler thread " INTPTR_FORMAT " poll detects block request", Thread::current());
1493#endif
1494    ThreadInVMfromNative tivfn(JavaThread::current());
1495  }
1496}
1497
1498
1499// ------------------------------------------------------------------
1500// CompileBroker::invoke_compiler_on_method
1501//
1502// Compile a method.
1503//
1504void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
1505  if (PrintCompilation) {
1506    ResourceMark rm;
1507    task->print_line();
1508  }
1509  elapsedTimer time;
1510
1511  CompilerThread* thread = CompilerThread::current();
1512  ResourceMark rm(thread);
1513
1514  // Common flags.
1515  uint compile_id = task->compile_id();
1516  int osr_bci = task->osr_bci();
1517  bool is_osr = (osr_bci != standard_entry_bci);
1518  bool should_log = (thread->log() != NULL);
1519  bool should_break = false;
1520  {
1521    // create the handle inside it's own block so it can't
1522    // accidentally be referenced once the thread transitions to
1523    // native.  The NoHandleMark before the transition should catch
1524    // any cases where this occurs in the future.
1525    methodHandle method(thread,
1526                        (methodOop)JNIHandles::resolve(task->method_handle()));
1527    should_break = check_break_at(method, compile_id, is_osr);
1528    if (should_log && !CompilerOracle::should_log(method)) {
1529      should_log = false;
1530    }
1531    assert(!method->is_native(), "no longer compile natives");
1532
1533    // Save information about this method in case of failure.
1534    set_last_compile(thread, method, is_osr, task->comp_level());
1535
1536    DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler(task->comp_level()), method);
1537  }
1538
1539  // Allocate a new set of JNI handles.
1540  push_jni_handle_block();
1541  jobject target_handle = JNIHandles::make_local(thread, JNIHandles::resolve(task->method_handle()));
1542  int compilable = ciEnv::MethodCompilable;
1543  {
1544    int system_dictionary_modification_counter;
1545    {
1546      MutexLocker locker(Compile_lock, thread);
1547      system_dictionary_modification_counter = SystemDictionary::number_of_modifications();
1548    }
1549
1550    NoHandleMark  nhm;
1551    ThreadToNativeFromVM ttn(thread);
1552
1553    ciEnv ci_env(task, system_dictionary_modification_counter);
1554    if (should_break) {
1555      ci_env.set_break_at_compile(true);
1556    }
1557    if (should_log) {
1558      ci_env.set_log(thread->log());
1559    }
1560    assert(thread->env() == &ci_env, "set by ci_env");
1561    // The thread-env() field is cleared in ~CompileTaskWrapper.
1562
1563    // Cache Jvmti state
1564    ci_env.cache_jvmti_state();
1565
1566    // Cache DTrace flags
1567    ci_env.cache_dtrace_flags();
1568
1569    ciMethod* target = ci_env.get_method_from_handle(target_handle);
1570
1571    TraceTime t1("compilation", &time);
1572
1573    compiler(task->comp_level())->compile_method(&ci_env, target, osr_bci);
1574
1575    if (!ci_env.failing() && task->code() == NULL) {
1576      //assert(false, "compiler should always document failure");
1577      // The compiler elected, without comment, not to register a result.
1578      // Do not attempt further compilations of this method.
1579      ci_env.record_method_not_compilable("compile failed", !TieredCompilation);
1580    }
1581
1582    if (ci_env.failing()) {
1583      // Copy this bit to the enclosing block:
1584      compilable = ci_env.compilable();
1585      if (PrintCompilation) {
1586        const char* reason = ci_env.failure_reason();
1587        if (compilable == ciEnv::MethodCompilable_not_at_tier) {
1588            tty->print_cr("%3d   COMPILE SKIPPED: %s (retry at different tier)", compile_id, reason);
1589        } else if (compilable == ciEnv::MethodCompilable_never) {
1590          tty->print_cr("%3d   COMPILE SKIPPED: %s (not retryable)", compile_id, reason);
1591        } else if (compilable == ciEnv::MethodCompilable) {
1592          tty->print_cr("%3d   COMPILE SKIPPED: %s", compile_id, reason);
1593        }
1594      }
1595    } else {
1596      task->mark_success();
1597      task->set_num_inlined_bytecodes(ci_env.num_inlined_bytecodes());
1598    }
1599  }
1600  pop_jni_handle_block();
1601
1602  methodHandle method(thread,
1603                      (methodOop)JNIHandles::resolve(task->method_handle()));
1604
1605  DTRACE_METHOD_COMPILE_END_PROBE(compiler(task->comp_level()), method, task->is_success());
1606
1607  collect_statistics(thread, time, task);
1608
1609  if (compilable == ciEnv::MethodCompilable_never) {
1610    if (is_osr) {
1611      method->set_not_osr_compilable();
1612    } else {
1613      method->set_not_compilable_quietly();
1614    }
1615  } else if (compilable == ciEnv::MethodCompilable_not_at_tier) {
1616    method->set_not_compilable_quietly(task->comp_level());
1617  }
1618
1619  // Note that the queued_for_compilation bits are cleared without
1620  // protection of a mutex. [They were set by the requester thread,
1621  // when adding the task to the complie queue -- at which time the
1622  // compile queue lock was held. Subsequently, we acquired the compile
1623  // queue lock to get this task off the compile queue; thus (to belabour
1624  // the point somewhat) our clearing of the bits must be occurring
1625  // only after the setting of the bits. See also 14012000 above.
1626  method->clear_queued_for_compilation();
1627
1628#ifdef ASSERT
1629  if (CollectedHeap::fired_fake_oom()) {
1630    // The current compile received a fake OOM during compilation so
1631    // go ahead and exit the VM since the test apparently succeeded
1632    tty->print_cr("*** Shutting down VM after successful fake OOM");
1633    vm_exit(0);
1634  }
1635#endif
1636}
1637
1638// ------------------------------------------------------------------
1639// CompileBroker::handle_full_code_cache
1640//
1641// The CodeCache is full.  Print out warning and disable compilation or
1642// try code cache cleaning so compilation can continue later.
1643void CompileBroker::handle_full_code_cache() {
1644  UseInterpreter = true;
1645  if (UseCompiler || AlwaysCompileLoopMethods ) {
1646    if (xtty != NULL) {
1647      xtty->begin_elem("code_cache_full");
1648      xtty->stamp();
1649      xtty->end_elem();
1650    }
1651    warning("CodeCache is full. Compiler has been disabled.");
1652    warning("Try increasing the code cache size using -XX:ReservedCodeCacheSize=");
1653#ifndef PRODUCT
1654    if (CompileTheWorld || ExitOnFullCodeCache) {
1655      before_exit(JavaThread::current());
1656      exit_globals(); // will delete tty
1657      vm_direct_exit(CompileTheWorld ? 0 : 1);
1658    }
1659#endif
1660    if (UseCodeCacheFlushing) {
1661      NMethodSweeper::handle_full_code_cache(true);
1662    } else {
1663      UseCompiler               = false;
1664      AlwaysCompileLoopMethods  = false;
1665    }
1666  }
1667}
1668
1669// ------------------------------------------------------------------
1670// CompileBroker::set_last_compile
1671//
1672// Record this compilation for debugging purposes.
1673void CompileBroker::set_last_compile(CompilerThread* thread, methodHandle method, bool is_osr, int comp_level) {
1674  ResourceMark rm;
1675  char* method_name = method->name()->as_C_string();
1676  strncpy(_last_method_compiled, method_name, CompileBroker::name_buffer_length);
1677  char current_method[CompilerCounters::cmname_buffer_length];
1678  size_t maxLen = CompilerCounters::cmname_buffer_length;
1679
1680  if (UsePerfData) {
1681    const char* class_name = method->method_holder()->klass_part()->name()->as_C_string();
1682
1683    size_t s1len = strlen(class_name);
1684    size_t s2len = strlen(method_name);
1685
1686    // check if we need to truncate the string
1687    if (s1len + s2len + 2 > maxLen) {
1688
1689      // the strategy is to lop off the leading characters of the
1690      // class name and the trailing characters of the method name.
1691
1692      if (s2len + 2 > maxLen) {
1693        // lop of the entire class name string, let snprintf handle
1694        // truncation of the method name.
1695        class_name += s1len; // null string
1696      }
1697      else {
1698        // lop off the extra characters from the front of the class name
1699        class_name += ((s1len + s2len + 2) - maxLen);
1700      }
1701    }
1702
1703    jio_snprintf(current_method, maxLen, "%s %s", class_name, method_name);
1704  }
1705
1706  if (CICountOSR && is_osr) {
1707    _last_compile_type = osr_compile;
1708  } else {
1709    _last_compile_type = normal_compile;
1710  }
1711  _last_compile_level = comp_level;
1712
1713  if (UsePerfData) {
1714    CompilerCounters* counters = thread->counters();
1715    counters->set_current_method(current_method);
1716    counters->set_compile_type((jlong)_last_compile_type);
1717  }
1718}
1719
1720
1721// ------------------------------------------------------------------
1722// CompileBroker::push_jni_handle_block
1723//
1724// Push on a new block of JNI handles.
1725void CompileBroker::push_jni_handle_block() {
1726  JavaThread* thread = JavaThread::current();
1727
1728  // Allocate a new block for JNI handles.
1729  // Inlined code from jni_PushLocalFrame()
1730  JNIHandleBlock* java_handles = thread->active_handles();
1731  JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
1732  assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
1733  compile_handles->set_pop_frame_link(java_handles);  // make sure java handles get gc'd.
1734  thread->set_active_handles(compile_handles);
1735}
1736
1737
1738// ------------------------------------------------------------------
1739// CompileBroker::pop_jni_handle_block
1740//
1741// Pop off the current block of JNI handles.
1742void CompileBroker::pop_jni_handle_block() {
1743  JavaThread* thread = JavaThread::current();
1744
1745  // Release our JNI handle block
1746  JNIHandleBlock* compile_handles = thread->active_handles();
1747  JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
1748  thread->set_active_handles(java_handles);
1749  compile_handles->set_pop_frame_link(NULL);
1750  JNIHandleBlock::release_block(compile_handles, thread); // may block
1751}
1752
1753
1754// ------------------------------------------------------------------
1755// CompileBroker::check_break_at
1756//
1757// Should the compilation break at the current compilation.
1758bool CompileBroker::check_break_at(methodHandle method, int compile_id, bool is_osr) {
1759  if (CICountOSR && is_osr && (compile_id == CIBreakAtOSR)) {
1760    return true;
1761  } else if( CompilerOracle::should_break_at(method) ) { // break when compiling
1762    return true;
1763  } else {
1764    return (compile_id == CIBreakAt);
1765  }
1766}
1767
1768// ------------------------------------------------------------------
1769// CompileBroker::collect_statistics
1770//
1771// Collect statistics about the compilation.
1772
1773void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time, CompileTask* task) {
1774  bool success = task->is_success();
1775  methodHandle method (thread, (methodOop)JNIHandles::resolve(task->method_handle()));
1776  uint compile_id = task->compile_id();
1777  bool is_osr = (task->osr_bci() != standard_entry_bci);
1778  nmethod* code = task->code();
1779  CompilerCounters* counters = thread->counters();
1780
1781  assert(code == NULL || code->is_locked_by_vm(), "will survive the MutexLocker");
1782  MutexLocker locker(CompileStatistics_lock);
1783
1784  // _perf variables are production performance counters which are
1785  // updated regardless of the setting of the CITime and CITimeEach flags
1786  //
1787  if (!success) {
1788    _total_bailout_count++;
1789    if (UsePerfData) {
1790      _perf_last_failed_method->set_value(counters->current_method());
1791      _perf_last_failed_type->set_value(counters->compile_type());
1792      _perf_total_bailout_count->inc();
1793    }
1794  } else if (code == NULL) {
1795    if (UsePerfData) {
1796      _perf_last_invalidated_method->set_value(counters->current_method());
1797      _perf_last_invalidated_type->set_value(counters->compile_type());
1798      _perf_total_invalidated_count->inc();
1799    }
1800    _total_invalidated_count++;
1801  } else {
1802    // Compilation succeeded
1803
1804    // update compilation ticks - used by the implementation of
1805    // java.lang.management.CompilationMBean
1806    _perf_total_compilation->inc(time.ticks());
1807
1808    if (CITime) {
1809      _t_total_compilation.add(time);
1810      if (is_osr) {
1811        _t_osr_compilation.add(time);
1812        _sum_osr_bytes_compiled += method->code_size() + task->num_inlined_bytecodes();
1813      } else {
1814        _t_standard_compilation.add(time);
1815        _sum_standard_bytes_compiled += method->code_size() + task->num_inlined_bytecodes();
1816      }
1817    }
1818
1819    if (UsePerfData) {
1820      // save the name of the last method compiled
1821      _perf_last_method->set_value(counters->current_method());
1822      _perf_last_compile_type->set_value(counters->compile_type());
1823      _perf_last_compile_size->set_value(method->code_size() +
1824                                         task->num_inlined_bytecodes());
1825      if (is_osr) {
1826        _perf_osr_compilation->inc(time.ticks());
1827        _perf_sum_osr_bytes_compiled->inc(method->code_size() + task->num_inlined_bytecodes());
1828      } else {
1829        _perf_standard_compilation->inc(time.ticks());
1830        _perf_sum_standard_bytes_compiled->inc(method->code_size() + task->num_inlined_bytecodes());
1831      }
1832    }
1833
1834    if (CITimeEach) {
1835      float bytes_per_sec = 1.0 * (method->code_size() + task->num_inlined_bytecodes()) / time.seconds();
1836      tty->print_cr("%3d   seconds: %f bytes/sec : %f (bytes %d + %d inlined)",
1837                    compile_id, time.seconds(), bytes_per_sec, method->code_size(), task->num_inlined_bytecodes());
1838    }
1839
1840    // Collect counts of successful compilations
1841    _sum_nmethod_size      += code->total_size();
1842    _sum_nmethod_code_size += code->insts_size();
1843    _total_compile_count++;
1844
1845    if (UsePerfData) {
1846      _perf_sum_nmethod_size->inc(     code->total_size());
1847      _perf_sum_nmethod_code_size->inc(code->insts_size());
1848      _perf_total_compile_count->inc();
1849    }
1850
1851    if (is_osr) {
1852      if (UsePerfData) _perf_total_osr_compile_count->inc();
1853      _total_osr_compile_count++;
1854    } else {
1855      if (UsePerfData) _perf_total_standard_compile_count->inc();
1856      _total_standard_compile_count++;
1857    }
1858  }
1859  // set the current method for the thread to null
1860  if (UsePerfData) counters->set_current_method("");
1861}
1862
1863
1864
1865void CompileBroker::print_times() {
1866  tty->cr();
1867  tty->print_cr("Accumulated compiler times (for compiled methods only)");
1868  tty->print_cr("------------------------------------------------");
1869               //0000000000111111111122222222223333333333444444444455555555556666666666
1870               //0123456789012345678901234567890123456789012345678901234567890123456789
1871  tty->print_cr("  Total compilation time   : %6.3f s", CompileBroker::_t_total_compilation.seconds());
1872  tty->print_cr("    Standard compilation   : %6.3f s, Average : %2.3f",
1873                CompileBroker::_t_standard_compilation.seconds(),
1874                CompileBroker::_t_standard_compilation.seconds() / CompileBroker::_total_standard_compile_count);
1875  tty->print_cr("    On stack replacement   : %6.3f s, Average : %2.3f", CompileBroker::_t_osr_compilation.seconds(), CompileBroker::_t_osr_compilation.seconds() / CompileBroker::_total_osr_compile_count);
1876
1877  if (compiler(CompLevel_simple) != NULL) {
1878    compiler(CompLevel_simple)->print_timers();
1879  }
1880  if (compiler(CompLevel_full_optimization) != NULL) {
1881    compiler(CompLevel_full_optimization)->print_timers();
1882  }
1883  tty->cr();
1884  int tcb = CompileBroker::_sum_osr_bytes_compiled + CompileBroker::_sum_standard_bytes_compiled;
1885  tty->print_cr("  Total compiled bytecodes : %6d bytes", tcb);
1886  tty->print_cr("    Standard compilation   : %6d bytes", CompileBroker::_sum_standard_bytes_compiled);
1887  tty->print_cr("    On stack replacement   : %6d bytes", CompileBroker::_sum_osr_bytes_compiled);
1888  int bps = (int)(tcb / CompileBroker::_t_total_compilation.seconds());
1889  tty->print_cr("  Average compilation speed: %6d bytes/s", bps);
1890  tty->cr();
1891  tty->print_cr("  nmethod code size        : %6d bytes", CompileBroker::_sum_nmethod_code_size);
1892  tty->print_cr("  nmethod total size       : %6d bytes", CompileBroker::_sum_nmethod_size);
1893}
1894
1895
1896// Debugging output for failure
1897void CompileBroker::print_last_compile() {
1898  if ( _last_compile_level != CompLevel_none &&
1899       compiler(_last_compile_level) != NULL &&
1900       _last_method_compiled != NULL &&
1901       _last_compile_type != no_compile) {
1902    if (_last_compile_type == osr_compile) {
1903      tty->print_cr("Last parse:  [osr]%d+++(%d) %s",
1904                    _osr_compilation_id, _last_compile_level, _last_method_compiled);
1905    } else {
1906      tty->print_cr("Last parse:  %d+++(%d) %s",
1907                    _compilation_id, _last_compile_level, _last_method_compiled);
1908    }
1909  }
1910}
1911
1912
1913void CompileBroker::print_compiler_threads_on(outputStream* st) {
1914#ifndef PRODUCT
1915  st->print_cr("Compiler thread printing unimplemented.");
1916  st->cr();
1917#endif
1918}
1919