Skip to content

Commit afba636

Browse files
author
Markus Grönlund
committed
8369991: Thread blocking during JFR emergency dump must be in safepoint safe state
Reviewed-by: fandreuzzi, egahlin
1 parent 92e380c commit afba636

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

src/hotspot/share/jfr/recorder/repository/jfrEmergencyDump.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ const char* JfrEmergencyDump::chunk_path(const char* repository_path) {
458458
*/
459459
static void release_locks(Thread* thread) {
460460
assert(thread != nullptr, "invariant");
461+
assert(!thread->is_Java_thread() || JavaThread::cast(thread)->thread_state() == _thread_in_vm, "invariant");
461462

462463
#ifdef ASSERT
463464
Mutex* owned_lock = thread->owned_locks();
@@ -519,13 +520,14 @@ static void release_locks(Thread* thread) {
519520

520521
class JavaThreadInVMAndNative : public StackObj {
521522
private:
522-
JavaThread* const _jt;
523+
JavaThread* _jt;
523524
JavaThreadState _original_state;
524525
public:
525526

526-
JavaThreadInVMAndNative(Thread* t) : _jt(t->is_Java_thread() ? JavaThread::cast(t) : nullptr),
527+
JavaThreadInVMAndNative(Thread* t) : _jt(nullptr),
527528
_original_state(_thread_max_state) {
528-
if (_jt != nullptr) {
529+
if (t != nullptr && t->is_Java_thread()) {
530+
_jt = JavaThread::cast(t);
529531
_original_state = _jt->thread_state();
530532
if (_original_state != _thread_in_vm) {
531533
_jt->set_thread_state(_thread_in_vm);
@@ -535,6 +537,7 @@ class JavaThreadInVMAndNative : public StackObj {
535537

536538
~JavaThreadInVMAndNative() {
537539
if (_original_state != _thread_max_state) {
540+
assert(_jt != nullptr, "invariant");
538541
_jt->set_thread_state(_original_state);
539542
}
540543
}
@@ -574,11 +577,13 @@ static bool guard_reentrancy() {
574577
Thread* const thread = Thread::current_or_null_safe();
575578
const traceid tid = thread != nullptr ? JFR_JVM_THREAD_ID(thread) : max_julong;
576579
if (AtomicAccess::cmpxchg(&_jfr_shutdown_tid, shutdown_tid, tid) != shutdown_tid) {
580+
JavaThreadInVMAndNative jtivm(thread);
577581
if (thread != nullptr) {
578-
JavaThreadInVMAndNative jtivm(thread);
579582
release_locks(thread);
580583
}
581584
log_info(jfr, system)("A jfr emergency dump is already in progress, waiting for thread id " UINT64_FORMAT_X, AtomicAccess::load(&_jfr_shutdown_tid));
585+
// Transition to a safe safepoint state for the infinite sleep. A nop for non-java threads.
586+
jtivm.transition_to_native();
582587
os::infinite_sleep(); // stay here until we exit normally or crash.
583588
ShouldNotReachHere();
584589
}

0 commit comments

Comments
 (0)