8209670: CompilerThread releasing code buffer in destructor is unsafe

Don't free temporary code buffers in compiler thread destructor to avoid interference with safepoint code.

Reviewed-by: kvn, dholmes, zgu
This commit is contained in:
Tobias Hartmann 2018-08-21 17:47:59 +02:00
parent ea4f2f60d5
commit aef7c93375
2 changed files with 11 additions and 5 deletions

View file

@ -1637,6 +1637,12 @@ bool CompileBroker::init_compiler_runtime() {
* out to be a problem.
*/
void CompileBroker::shutdown_compiler_runtime(AbstractCompiler* comp, CompilerThread* thread) {
// Free buffer blob, if allocated
if (thread->get_buffer_blob() != NULL) {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
CodeCache::free(thread->get_buffer_blob());
}
if (comp->should_perform_shutdown()) {
// There are two reasons for shutting down the compiler
// 1) compiler runtime initialization failed
@ -1767,6 +1773,11 @@ void CompileBroker::compiler_thread_loop() {
tty->print_cr("Removing compiler thread %s after " JLONG_FORMAT " ms idle time",
thread->name(), thread->idle_time_millis());
}
// Free buffer blob, if allocated
if (thread->get_buffer_blob() != NULL) {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
CodeCache::free(thread->get_buffer_blob());
}
return; // Stop this thread.
}
}