From a40ee18fc7b42fbe18d67f014190071ae2cfac35 Mon Sep 17 00:00:00 2001 From: Evgeny Astigeevich Date: Tue, 9 Jun 2026 14:11:36 +0000 Subject: [PATCH] Add SuspendedThreadTask_lock to guard SuspendedThreadTask::run --- .../jfr/periodic/sampling/jfrThreadSampler.cpp | 11 ++++++++++- src/hotspot/share/runtime/hotCodeSampler.cpp | 5 +---- src/hotspot/share/runtime/hotCodeSampler.hpp | 13 +++++++++++++ src/hotspot/share/runtime/mutexLocker.cpp | 2 ++ src/hotspot/share/runtime/mutexLocker.hpp | 1 + 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrThreadSampler.cpp b/src/hotspot/share/jfr/periodic/sampling/jfrThreadSampler.cpp index 0a8b3975139..965568c706f 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrThreadSampler.cpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrThreadSampler.cpp @@ -32,6 +32,9 @@ #include "jfr/utilities/jfrTryLock.hpp" #include "jfr/utilities/jfrTypes.hpp" #include "logging/log.hpp" +#ifdef COMPILER2 +#include "opto/c2_globals.hpp" +#endif #include "runtime/atomicAccess.hpp" #include "runtime/globals.hpp" #include "runtime/javaThread.inline.hpp" @@ -288,7 +291,13 @@ class OSThreadSampler : public SuspendedThreadTask { public: OSThreadSampler(JavaThread* jt) : SuspendedThreadTask(jt), _result(THREAD_SUSPENSION_ERROR) {} - void request_sample() { run(); } + void request_sample() { + ConditionalMutexLocker ml(Thread::current(), SuspendedThreadTask_lock, + COMPILER2_PRESENT(HotCodeHeap) NOT_COMPILER2(false), + Mutex::_no_safepoint_check_flag); + run(); + } + JfrSampleResult result() const { return _result; } void do_task(const SuspendedThreadTaskContext& context) { diff --git a/src/hotspot/share/runtime/hotCodeSampler.cpp b/src/hotspot/share/runtime/hotCodeSampler.cpp index 4f25b0989a7..3e0b5022fed 100644 --- a/src/hotspot/share/runtime/hotCodeSampler.cpp +++ b/src/hotspot/share/runtime/hotCodeSampler.cpp @@ -30,9 +30,6 @@ #include "runtime/javaThread.inline.hpp" void ThreadSampler::sample_all_java_threads() { - // Hold Threads_lock to coordinate with other samplers (such as JFR) - MutexLocker ml(Threads_lock); - // Collect samples for each JavaThread for (JavaThreadIteratorWithHandle jtiwh; JavaThread *jt = jtiwh.next(); ) { if (jt->is_hidden_from_external_view() || @@ -42,7 +39,7 @@ void ThreadSampler::sample_all_java_threads() { } GetPCTask task(jt); - task.run(); + task.request_pc(); address pc = task.pc(); if (pc == nullptr) { continue; diff --git a/src/hotspot/share/runtime/hotCodeSampler.hpp b/src/hotspot/share/runtime/hotCodeSampler.hpp index d61cac791e1..44aa3527173 100644 --- a/src/hotspot/share/runtime/hotCodeSampler.hpp +++ b/src/hotspot/share/runtime/hotCodeSampler.hpp @@ -22,6 +22,8 @@ * */ +#include "runtime/mutex.hpp" +#include "runtime/mutexLocker.hpp" #ifdef COMPILER2 #ifndef SHARE_RUNTIME_HOTCODESAMPLER_HPP #define SHARE_RUNTIME_HOTCODESAMPLER_HPP @@ -75,6 +77,17 @@ class GetPCTask : public SuspendedThreadTask { public: GetPCTask(JavaThread* thread) : SuspendedThreadTask(thread), _pc(nullptr) {} + void request_pc() { +#if INCLUDE_JFR + if (SuspendedThreadTask_lock->try_lock()) { + run(); + SuspendedThreadTask_lock->unlock(); + } +#else + run(); +#endif + } + address pc() const { return _pc; } diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp index 32e7208474d..e2473bdfb04 100644 --- a/src/hotspot/share/runtime/mutexLocker.cpp +++ b/src/hotspot/share/runtime/mutexLocker.cpp @@ -121,6 +121,7 @@ Mutex* Verify_lock = nullptr; Mutex* JfrStacktrace_lock = nullptr; Monitor* JfrMsg_lock = nullptr; Mutex* JfrBuffer_lock = nullptr; +Mutex* SuspendedThreadTask_lock = nullptr; #endif Mutex* CodeHeapStateAnalytics_lock = nullptr; @@ -280,6 +281,7 @@ void mutex_init() { MUTEX_DEFN(JfrBuffer_lock , PaddedMutex , event); MUTEX_DEFN(JfrMsg_lock , PaddedMonitor, event); MUTEX_DEFN(JfrStacktrace_lock , PaddedMutex , event); + MUTEX_DEFN(SuspendedThreadTask_lock , PaddedMutex , nosafepoint); #endif MUTEX_DEFN(ContinuationRelativize_lock , PaddedMonitor, nosafepoint-3); diff --git a/src/hotspot/share/runtime/mutexLocker.hpp b/src/hotspot/share/runtime/mutexLocker.hpp index 044fcb732af..aeee000b377 100644 --- a/src/hotspot/share/runtime/mutexLocker.hpp +++ b/src/hotspot/share/runtime/mutexLocker.hpp @@ -139,6 +139,7 @@ extern Mutex* FinalImageRecipes_lock; // Protecting the tables used b extern Mutex* JfrStacktrace_lock; // used to guard access to the JFR stacktrace table extern Monitor* JfrMsg_lock; // protects JFR messaging extern Mutex* JfrBuffer_lock; // protects JFR buffer operations +extern Mutex* SuspendedThreadTask_lock; // used to guard SuspendedThreadTask::run #endif extern Mutex* Metaspace_lock; // protects Metaspace virtualspace and chunk expansions