changeset 23383:0226d6bcb0d2

Notify the compiler on completion of a bootstrap (JDK-8156034)
author Josef Eisl <josef.eisl@jku.at>
date Mon, 02 May 2016 14:57:11 +0200
parents c9915c22a5a9
children f102ee538647
files jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/services/HotSpotVMEventListener.java src/share/vm/classfile/vmSymbols.hpp src/share/vm/jvmci/jvmciCompiler.cpp src/share/vm/jvmci/jvmciCompiler.hpp src/share/vm/jvmci/jvmciRuntime.cpp src/share/vm/jvmci/jvmciRuntime.hpp
diffstat 7 files changed, 44 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java	Tue May 10 11:17:23 2016 +0200
+++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java	Mon May 02 14:57:11 2016 +0200
@@ -382,6 +382,18 @@
     }
 
     /**
+     * Notify on completion of a bootstrap.
+     *
+     * Called from the VM.
+     */
+    @SuppressWarnings({"unused"})
+    private void bootstrapFinished() throws Exception {
+        for (HotSpotVMEventListener vmEventListener : vmEventListeners) {
+            vmEventListener.notifyBootstrapFinished();
+        }
+    }
+
+    /**
      * Notify on successful install into the CodeCache.
      *
      * @param hotSpotCodeCacheProvider
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/services/HotSpotVMEventListener.java	Tue May 10 11:17:23 2016 +0200
+++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/services/HotSpotVMEventListener.java	Mon May 02 14:57:11 2016 +0200
@@ -75,6 +75,12 @@
     }
 
     /**
+     * Notify on completion of a bootstrap.
+     */
+    public void notifyBootstrapFinished() {
+    }
+
+    /**
      * Create a custom {@link JVMCIMetaAccessContext} to be used for managing the lifetime of loaded
      * metadata. It a custom one isn't created then the default implementation will be a single
      * context with globally shared instances of {@link ResolvedJavaType} that are never released.
--- a/src/share/vm/classfile/vmSymbols.hpp	Tue May 10 11:17:23 2016 +0200
+++ b/src/share/vm/classfile/vmSymbols.hpp	Mon May 02 14:57:11 2016 +0200
@@ -327,6 +327,7 @@
   template(nthreads_name,                             "nthreads")                                 \
   template(ngroups_name,                              "ngroups")                                  \
   template(shutdown_method_name,                      "shutdown")                                 \
+  template(bootstrapFinished_method_name,             "bootstrapFinished")                        \
   template(finalize_method_name,                      "finalize")                                 \
   template(reference_lock_name,                       "lock")                                     \
   template(reference_discovered_name,                 "discovered")                               \
--- a/src/share/vm/jvmci/jvmciCompiler.cpp	Tue May 10 11:17:23 2016 +0200
+++ b/src/share/vm/jvmci/jvmciCompiler.cpp	Mon May 02 14:57:11 2016 +0200
@@ -37,6 +37,7 @@
 JVMCICompiler::JVMCICompiler() : AbstractCompiler(jvmci) {
 #ifdef COMPILERJVMCI
   _bootstrapping = false;
+  _bootstrap_compilation_request_seen =  false;
   _methods_compiled = 0;
 #endif
   assert(_instance == NULL, "only one instance allowed");
@@ -100,7 +101,7 @@
     do {
       os::sleep(THREAD, 100, true);
       qsize = CompileBroker::queue_size(CompLevel_full_optimization);
-    } while (first_round && qsize == 0);
+    } while (!_bootstrap_compilation_request_seen && first_round && qsize == 0);
     first_round = false;
     if (PrintBootstrap) {
       while (z < (_methods_compiled / 100)) {
@@ -114,6 +115,7 @@
     tty->print_cr(" in " JLONG_FORMAT " ms (compiled %d methods)", os::javaTimeMillis() - start, _methods_compiled);
   }
   _bootstrapping = false;
+  JVMCIRuntime::bootstrapFinished();
 }
 
 void JVMCICompiler::compile_method(const methodHandle& method, int entry_bci, JVMCIEnv* env) {
@@ -179,6 +181,9 @@
       assert(false, "JVMCICompiler.compileMethod should always return non-null");
     }
   }
+  if (_bootstrapping) {
+    _bootstrap_compilation_request_seen = true;
+  }
 }
 
 
--- a/src/share/vm/jvmci/jvmciCompiler.hpp	Tue May 10 11:17:23 2016 +0200
+++ b/src/share/vm/jvmci/jvmciCompiler.hpp	Mon May 02 14:57:11 2016 +0200
@@ -35,6 +35,11 @@
   bool _bootstrapping;
 
   /**
+   * True if we have seen the a bootstrap compilation request.
+   */
+  volatile bool _bootstrap_compilation_request_seen;
+
+  /**
    * Number of methods successfully compiled by a call to
    * JVMCICompiler::compile_method().
    */
--- a/src/share/vm/jvmci/jvmciRuntime.cpp	Tue May 10 11:17:23 2016 +0200
+++ b/src/share/vm/jvmci/jvmciRuntime.cpp	Mon May 02 14:57:11 2016 +0200
@@ -919,6 +919,18 @@
   }
 }
 
+void JVMCIRuntime::bootstrapFinished() {
+  if (_HotSpotJVMCIRuntime_instance != NULL) {
+    JavaThread* THREAD = JavaThread::current();
+    HandleMark hm(THREAD);
+    Handle receiver = get_HotSpotJVMCIRuntime(CHECK_ABORT);
+    JavaValue result(T_VOID);
+    JavaCallArguments args;
+    args.push_oop(receiver);
+    JavaCalls::call_special(&result, receiver->klass(), vmSymbols::bootstrapFinished_method_name(), vmSymbols::void_method_signature(), &args, CHECK_ABORT);
+  }
+}
+
 bool JVMCIRuntime::treat_as_trivial(Method* method) {
   if (_HotSpotJVMCIRuntime_initialized) {
     oop loader = method->method_holder()->class_loader();
--- a/src/share/vm/jvmci/jvmciRuntime.hpp	Tue May 10 11:17:23 2016 +0200
+++ b/src/share/vm/jvmci/jvmciRuntime.hpp	Mon May 02 14:57:11 2016 +0200
@@ -143,6 +143,8 @@
 
   static void shutdown();
 
+  static void bootstrapFinished();
+
   static bool shutdown_called() {
     return _shutdown_called;
   }