--- 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);
}
}
}
--- 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: