RFR: 8365192: post_meth_exit should be in vm state when calling get_jvmti_thread_state

Serguei Spitsyn sspitsyn at openjdk.org
Wed Aug 13 06:07:22 UTC 2025


On Sat, 9 Aug 2025 20:30:14 GMT, Leonid Mesnik <lmesnik at openjdk.org> wrote:

> The method
> get_jvmti_thread_state()
> should be called only while thread is in vm state.
> 
> The post_method_exit is doing some preparation before switching to vm state. This cause issues if thread is needed to initialize jvmti thread state.
> 
> The fix was found using jvmti stress agent and thus no additional regression test is required.

src/hotspot/share/prims/jvmtiExport.cpp line 1839:

> 1837:   JRT_BLOCK
> 1838:   state = get_jvmti_thread_state(thread);
> 1839:   JRT_BLOCK_END

The `JRT_BLOCK` is defined as:

#define JRT_BLOCK                                                    \
    {                                                                \
    assert(current == JavaThread::current(), "Must be");             \
    ThreadInVMfromJava __tiv(current);                               \
    JavaThread* THREAD = current; /* For exception macros. */        \
    DEBUG_ONLY(VMEntryWrapper __vew;)


I'd suggest something like this instead of using `JRT_BLOCK`:

-  JvmtiThreadState *state = get_jvmti_thread_state(thread);
+   JvmtiThreadState *state = nullptr;
+  {
+     ThreadInVMfromJava __tiv(thread);
+     state = get_jvmti_thread_state(thread);
+  }


Alternatively, the `JRT_BLOCK` can be started at the line 1837 and ended with `JRT_BLOCK_END` at the line 1875. Not sure, what issue we can encounter with this though. At least, it is worth a try.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/26713#discussion_r2272164623


More information about the serviceability-dev mailing list