# HG changeset patch # User Josef Eisl # Date 1462193831 -7200 # Node ID 0226d6bcb0d29de678b7b7c09aaf07a71ad6a96a # Parent c9915c22a5a9e0a95536a536ff3cdd8f215f81fc Notify the compiler on completion of a bootstrap (JDK-8156034) diff -r c9915c22a5a9 -r 0226d6bcb0d2 jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java --- 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 diff -r c9915c22a5a9 -r 0226d6bcb0d2 jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/services/HotSpotVMEventListener.java --- 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. diff -r c9915c22a5a9 -r 0226d6bcb0d2 src/share/vm/classfile/vmSymbols.hpp --- 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") \ diff -r c9915c22a5a9 -r 0226d6bcb0d2 src/share/vm/jvmci/jvmciCompiler.cpp --- 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; + } } diff -r c9915c22a5a9 -r 0226d6bcb0d2 src/share/vm/jvmci/jvmciCompiler.hpp --- 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(). */ diff -r c9915c22a5a9 -r 0226d6bcb0d2 src/share/vm/jvmci/jvmciRuntime.cpp --- 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(); diff -r c9915c22a5a9 -r 0226d6bcb0d2 src/share/vm/jvmci/jvmciRuntime.hpp --- 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; }