RFR: 8296323: JVMTI can_support_virtual_threads not available for agents loaded into running VM [v4]

Richard Reingruber rrich at openjdk.org
Mon Nov 21 22:36:13 UTC 2022


On Mon, 21 Nov 2022 19:08:16 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:

>> src/hotspot/share/prims/jvmtiExport.cpp line 201:
>> 
>>> 199:   JvmtiVirtualThreadEventMark(JavaThread *thread) :
>>> 200:     JvmtiEventMark(thread) {
>>> 201:     if (thread->vthread() != NULL) {
>> 
>> Can this condition ever be false?
>
> Yes, this condition can be false for platform threads.

The [comment](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/javaThread.hpp#L88) suggests that `vthread()` cannot evaluate to NULL. Otherwise `Thread.currentThread()` would return null too.

I've experimented a little bit and found that `thread->vthread()` in fact can be NULL during initialization but then `thread->threadObj()` is also not yet initialized. E.g. in `Threads::initialize_java_lang_classes()` class events are generated before `create_initial_thread()` is reached. The constructor of `JvmtiClassEventMark` calls its parent class' constructor, that is `JvmtiVirtualThreadEventMark`,  with a not yet fully initialized initial thread.

I found that `jtreg:test/hotspot/jtreg:hotspot_serviceability` succeeds with `assert(thread->vthread() != NULL || thread->threadObj() == NULL, "");`
So you could unconditionally use `thread->vthread()`.

>> test/hotspot/jtreg/serviceability/jvmti/vthread/VirtualThreadStartTest/libVirtualThreadStartTest.cpp line 54:
>> 
>>> 52:     started_thread_cnt++;
>>> 53:   }
>>> 54:   deallocate(jvmti, jni, (void*)tname);
>> 
>> This will crash if `get_thread_name()` returns the string constant `"<Unnamed thread>"`
>
> Nice catch.
> It is strange I've never seen any related crashes.
> This could be addressed separately but I've fixed it now.
> Please, let me know if you are okay with it.
> Will submit more mach5 runs to be safe.

The fix looks good to me. Thanks for taking care of the issue right away.

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

PR: https://git.openjdk.org/jdk/pull/11246


More information about the hotspot-dev mailing list