# HG changeset patch # User goetz # Date 1515019277 28800 # Node ID e569e83139fdfbecfeb3cd9014d560917787f158 # Parent b08405cc467a8312355f4a4379cffcf18fddac23 8194482: Fix SIGSEGV in print_threads_compiling. Reviewed-by: kvn diff -r b08405cc467a -r e569e83139fd src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp Wed Jan 03 11:10:56 2018 -0800 +++ b/src/hotspot/share/runtime/thread.cpp Wed Jan 03 14:41:17 2018 -0800 @@ -2946,8 +2946,9 @@ if (ct->env() != NULL) { ct->env()->metadata_do(f); } - if (ct->task() != NULL) { - ct->task()->metadata_do(f); + CompileTask* task = ct->task(); + if (task != NULL) { + task->metadata_do(f); } } } @@ -3001,10 +3002,10 @@ _safepoint_state->print_on(st); #endif // PRODUCT if (is_Compiler_thread()) { - CompilerThread* ct = (CompilerThread*)this; - if (ct->task() != NULL) { + CompileTask *task = ((CompilerThread*)this)->task(); + if (task != NULL) { st->print(" Compiling: "); - ct->task()->print(st, NULL, true, false); + task->print(st, NULL, true, false); } else { st->print(" No compile task"); } @@ -4712,9 +4713,15 @@ ALL_JAVA_THREADS(thread) { if (thread->is_Compiler_thread()) { CompilerThread* ct = (CompilerThread*) thread; - if (ct->task() != NULL) { + + // Keep task in local variable for NULL check. + // ct->_task might be set to NULL by concurring compiler thread + // because it completed the compilation. The task is never freed, + // though, just returned to a free list. + CompileTask* task = ct->task(); + if (task != NULL) { thread->print_name_on_error(st, buf, buflen); - ct->task()->print(st, NULL, true, true); + task->print(st, NULL, true, true); } } } diff -r b08405cc467a -r e569e83139fd src/hotspot/share/runtime/thread.hpp --- a/src/hotspot/share/runtime/thread.hpp Wed Jan 03 11:10:56 2018 -0800 +++ b/src/hotspot/share/runtime/thread.hpp Wed Jan 03 14:41:17 2018 -0800 @@ -2064,13 +2064,13 @@ private: CompilerCounters* _counters; - ciEnv* _env; - CompileLog* _log; - CompileTask* _task; - CompileQueue* _queue; - BufferBlob* _buffer_blob; + ciEnv* _env; + CompileLog* _log; + CompileTask* volatile _task; // print_threads_compiling can read this concurrently. + CompileQueue* _queue; + BufferBlob* _buffer_blob; - AbstractCompiler* _compiler; + AbstractCompiler* _compiler; public: