8209889: RedefineStress tests crash
Summary: Create CompileTaskWrapper before potential safepoint
Reviewed-by: mdoerr, dlong
--- a/src/hotspot/share/compiler/compileBroker.cpp Fri Oct 05 08:50:49 2018 -0400
+++ b/src/hotspot/share/compiler/compileBroker.cpp Fri Oct 05 09:15:52 2018 -0400
@@ -1781,30 +1781,31 @@
return; // Stop this thread.
}
}
- continue;
- }
-
- if (UseDynamicNumberOfCompilerThreads) {
- possibly_add_compiler_threads();
- }
+ } else {
+ // Assign the task to the current thread. Mark this compilation
+ // thread as active for the profiler.
+ // CompileTaskWrapper also keeps the Method* from being deallocated if redefinition
+ // occurs after fetching the compile task off the queue.
+ CompileTaskWrapper ctw(task);
+ nmethodLocker result_handle; // (handle for the nmethod produced by this task)
+ task->set_code_handle(&result_handle);
+ methodHandle method(thread, task->method());
- // Assign the task to the current thread. Mark this compilation
- // thread as active for the profiler.
- CompileTaskWrapper ctw(task);
- nmethodLocker result_handle; // (handle for the nmethod produced by this task)
- task->set_code_handle(&result_handle);
- methodHandle method(thread, task->method());
+ // Never compile a method if breakpoints are present in it
+ if (method()->number_of_breakpoints() == 0) {
+ // Compile the method.
+ if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
+ invoke_compiler_on_method(task);
+ thread->start_idle_timer();
+ } else {
+ // After compilation is disabled, remove remaining methods from queue
+ method->clear_queued_for_compilation();
+ task->set_failure_reason("compilation is disabled");
+ }
+ }
- // Never compile a method if breakpoints are present in it
- if (method()->number_of_breakpoints() == 0) {
- // Compile the method.
- if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
- invoke_compiler_on_method(task);
- thread->start_idle_timer();
- } else {
- // After compilation is disabled, remove remaining methods from queue
- method->clear_queued_for_compilation();
- task->set_failure_reason("compilation is disabled");
+ if (UseDynamicNumberOfCompilerThreads) {
+ possibly_add_compiler_threads();
}
}
}