8203943: eventThreadGroup was null in TestJavaBlockedEvent.java

Reviewed-by: egahlin
This commit is contained in:
Markus Grönlund 2018-07-08 11:54:08 +02:00
parent 1fc1f68c3d
commit cb094826ec
4 changed files with 55 additions and 29 deletions

View File

@ -26,10 +26,10 @@
#include "jfr/jfr.hpp"
#include "jfr/leakprofiler/leakProfiler.hpp"
#include "jfr/periodic/sampling/jfrThreadSampler.hpp"
#include "jfr/recorder/service/jfrOptionSet.hpp"
#include "jfr/recorder/jfrRecorder.hpp"
#include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp"
#include "jfr/recorder/repository/jfrEmergencyDump.hpp"
#include "jfr/recorder/service/jfrOptionSet.hpp"
#include "jfr/support/jfrThreadLocal.hpp"
#include "runtime/java.hpp"
@ -64,9 +64,7 @@ void Jfr::on_unloading_classes() {
}
void Jfr::on_thread_exit(JavaThread* thread) {
if (JfrRecorder::is_recording()) {
JfrThreadLocal::on_exit(thread);
}
JfrThreadLocal::on_exit(thread);
}
void Jfr::on_thread_destruct(Thread* thread) {

View File

@ -60,22 +60,32 @@
#include "gc/g1/g1YCTypes.hpp"
#endif
class JfrCheckpointThreadCountClosure : public ThreadClosure {
private:
u4 _total_threads;
public:
JfrCheckpointThreadCountClosure() : _total_threads(0) {}
u4 total_threads() { return _total_threads; }
void do_thread(Thread *t) { _total_threads++; }
};
// Requires a ResourceMark for get_thread_name/as_utf8
class JfrCheckpointThreadClosure : public ThreadClosure {
private:
JfrCheckpointWriter& _writer;
Thread* _curthread;
JfrCheckpointContext _ctx;
const intptr_t _count_position;
Thread* const _curthread;
u4 _count;
public:
JfrCheckpointThreadClosure(JfrCheckpointWriter& writer) : _writer(writer), _curthread(Thread::current()) {}
JfrCheckpointThreadClosure(JfrCheckpointWriter& writer) : _writer(writer),
_ctx(writer.context()),
_count_position(writer.reserve(sizeof(u4))),
_curthread(Thread::current()),
_count(0) {
}
~JfrCheckpointThreadClosure() {
if (_count == 0) {
// restore
_writer.set_context(_ctx);
return;
}
_writer.write_count(_count, _count_position);
}
void do_thread(Thread* t);
};
@ -83,10 +93,16 @@ class JfrCheckpointThreadClosure : public ThreadClosure {
void JfrCheckpointThreadClosure::do_thread(Thread* t) {
assert(t != NULL, "invariant");
assert_locked_or_safepoint(Threads_lock);
_writer.write_key(t->jfr_thread_local()->thread_id());
const JfrThreadLocal* const tl = t->jfr_thread_local();
assert(tl != NULL, "invariant");
if (tl->is_dead()) {
return;
}
++_count;
_writer.write_key(tl->thread_id());
_writer.write(t->name());
const OSThread* const os_thread = t->osthread();
_writer.write<traceid>(os_thread != NULL ? os_thread->thread_id() : (u8)0);
_writer.write<traceid>(os_thread != NULL ? os_thread->thread_id() : 0);
if (t->is_Java_thread()) {
JavaThread* const jt = (JavaThread*)t;
_writer.write(jt->name());
@ -97,17 +113,12 @@ void JfrCheckpointThreadClosure::do_thread(Thread* t) {
return;
}
_writer.write((const char*)NULL); // java name
_writer.write<traceid>((traceid)0); // java thread id
_writer.write<traceid>((traceid)0); // java thread group
_writer.write((traceid)0); // java thread id
_writer.write((traceid)0); // java thread group
}
void JfrThreadConstantSet::serialize(JfrCheckpointWriter& writer) {
assert(SafepointSynchronize::is_at_safepoint(), "invariant");
JfrCheckpointThreadCountClosure tcc;
Threads::threads_do(&tcc);
const u4 total_threads = tcc.total_threads();
// THREADS
writer.write_count(total_threads);
JfrCheckpointThreadClosure tc(writer);
Threads::threads_do(&tc);
}
@ -334,7 +345,7 @@ void JfrThreadConstant::serialize(JfrCheckpointWriter& writer) {
writer.write_count(1);
writer.write_key(_thread->jfr_thread_local()->thread_id());
writer.write(thread_name);
writer.write((u8)_thread->osthread()->thread_id());
writer.write((traceid)_thread->osthread()->thread_id());
writer.write(thread_name);
writer.write(java_lang_thread_id);
writer.write(thread_group_id);

View File

@ -23,8 +23,9 @@
*/
#include "precompiled.hpp"
#include "jfr/periodic/jfrThreadCPULoadEvent.hpp"
#include "jfr/jni/jfrJavaSupport.hpp"
#include "jfr/periodic/jfrThreadCPULoadEvent.hpp"
#include "jfr/recorder/jfrRecorder.hpp"
#include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp"
#include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp"
#include "jfr/recorder/service/jfrOptionSet.hpp"
@ -51,7 +52,8 @@ JfrThreadLocal::JfrThreadLocal() :
_wallclock_time(os::javaTimeNanos()),
_stack_trace_hash(0),
_stackdepth(0),
_entering_suspend_flag(0) {}
_entering_suspend_flag(0),
_dead(false) {}
u8 JfrThreadLocal::add_data_lost(u8 value) {
_data_lost += value;
@ -71,9 +73,17 @@ const JfrCheckpointBlobHandle& JfrThreadLocal::thread_checkpoint() const {
return _thread_cp;
}
void JfrThreadLocal::set_dead() {
assert(!is_dead(), "invariant");
_dead = true;
}
void JfrThreadLocal::on_exit(JavaThread* thread) {
JfrCheckpointManager::write_thread_checkpoint(thread);
JfrThreadCPULoadEvent::send_event_for_thread(thread);
if (JfrRecorder::is_recording()) {
JfrCheckpointManager::write_thread_checkpoint(thread);
JfrThreadCPULoadEvent::send_event_for_thread(thread);
}
thread->jfr_thread_local()->set_dead();
}
void JfrThreadLocal::on_destruct(Thread* thread) {

View File

@ -50,11 +50,14 @@ class JfrThreadLocal {
unsigned int _stack_trace_hash;
mutable u4 _stackdepth;
volatile jint _entering_suspend_flag;
bool _dead;
JfrBuffer* install_native_buffer() const;
JfrBuffer* install_java_buffer() const;
JfrStackFrame* install_stackframes() const;
void set_dead();
public:
JfrThreadLocal();
@ -202,6 +205,10 @@ class JfrThreadLocal {
_trace_id = id;
}
bool is_dead() const {
return _dead;
}
bool has_thread_checkpoint() const;
void set_thread_checkpoint(const JfrCheckpointBlobHandle& handle);
const JfrCheckpointBlobHandle& thread_checkpoint() const;