From ffaecd4aa23ca15e765784858da82b632c72dfc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Gr=C3=B6nlund?= Date: Thu, 2 Nov 2023 19:34:51 +0000 Subject: [PATCH] 8315364: Assert thread state invariant for JFR stack trace capture Reviewed-by: egahlin --- .../share/jfr/recorder/service/jfrEvent.hpp | 16 ++++++++-------- .../jfr/recorder/stacktrace/jfrStackTrace.cpp | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/jfr/recorder/service/jfrEvent.hpp b/src/hotspot/share/jfr/recorder/service/jfrEvent.hpp index d487820c690..62e960cef5e 100644 --- a/src/hotspot/share/jfr/recorder/service/jfrEvent.hpp +++ b/src/hotspot/share/jfr/recorder/service/jfrEvent.hpp @@ -114,14 +114,6 @@ class JfrEvent { return JfrEventSetting::has_stacktrace(T::eventId); } - static bool is_large() { - return JfrEventSetting::is_large(T::eventId); - } - - static void set_large() { - JfrEventSetting::set_large(T::eventId); - } - static JfrEventId id() { return T::eventId; } @@ -248,6 +240,14 @@ class JfrEvent { return writer.end_event_write(large_size) > 0; } + static bool is_large() { + return JfrEventSetting::is_large(T::eventId); + } + + static void set_large() { + JfrEventSetting::set_large(T::eventId); + } + #ifdef ASSERT private: // Verification of fields. diff --git a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp index 97eb2ccf559..c70f626a2fe 100644 --- a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp +++ b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp @@ -234,6 +234,7 @@ bool JfrStackTrace::record_async(JavaThread* jt, const frame& frame) { assert(jt != nullptr, "invariant"); assert(!_lineno, "invariant"); Thread* current_thread = Thread::current(); + assert(current_thread->is_JfrSampler_thread(), "invariant"); assert(jt != current_thread, "invariant"); // Explicitly monitor the available space of the thread-local buffer used for enqueuing klasses as part of tagging methods. // We do this because if space becomes sparse, we cannot rely on the implicit allocation of a new buffer as part of the @@ -286,6 +287,7 @@ bool JfrStackTrace::record_async(JavaThread* jt, const frame& frame) { bool JfrStackTrace::record(JavaThread* jt, const frame& frame, int skip) { assert(jt != nullptr, "invariant"); assert(jt == Thread::current(), "invariant"); + assert(jt->thread_state() != _thread_in_native, "invariant"); assert(!_lineno, "invariant"); // Must use ResetNoHandleMark here to bypass if any NoHandleMark exist on stack. // This is because RegisterMap uses Handles to support continuations.