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