diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp index a66018c412d..9721e98c020 100644 --- a/src/hotspot/share/runtime/thread.cpp +++ b/src/hotspot/share/runtime/thread.cpp @@ -2946,8 +2946,9 @@ void JavaThread::metadata_do(void f(Metadata*)) { 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 @@ void JavaThread::print_on(outputStream *st) const { _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 @@ void Threads::print_threads_compiling(outputStream* st, char* buf, int buflen) { 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 --git a/src/hotspot/share/runtime/thread.hpp b/src/hotspot/share/runtime/thread.hpp index 59af4c23b85..61495f3360f 100644 --- a/src/hotspot/share/runtime/thread.hpp +++ b/src/hotspot/share/runtime/thread.hpp @@ -2064,13 +2064,13 @@ class CompilerThread : public JavaThread { 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: