RFR: 8364314: java_lang_Thread::get_thread_status fails assert(base != nullptr) failed: Invalid base [v2]
Daniel D. Daugherty
dcubed at openjdk.org
Wed Jul 30 17:18:55 UTC 2025
On Wed, 30 Jul 2025 06:24:39 GMT, David Holmes <dholmes at openjdk.org> wrote:
>> After the changes in JDK-8361912 we could "return " the carrier thread from `cv_internal_thread_to_JavaThread`, but before we hit the transition disabler the virtual thread could unmount. As a result when we execute this code:
>>
>> if (is_virtual) {
>> // 1st need to disable mount/unmount transitions
>> transition_disabler.init(jthread);
>>
>> carrier_thread = Handle(THREAD, java_lang_VirtualThread::carrier_thread(thread_h()));
>> if (carrier_thread != nullptr) {
>> java_thread = java_lang_Thread::thread(carrier_thread());
>> }
>> }
>>
>> we hit the implicit else where "`carrier_thread == nullptr`" and we do nothing, but `java_thread` still holds the old carrier, which we then perform the handshake operation with:
>>
>> void do_thread(Thread* th) override {
>> Thread* current = Thread::current();
>>
>> bool is_virtual = java_lang_VirtualThread::is_instance(_thread_h());
>> if (_java_thread != nullptr) {
>> if (is_virtual) {
>> // mounted vthread, use carrier thread state
>> oop carrier_thread = java_lang_VirtualThread::carrier_thread(_thread_h());
>> _thread_status = java_lang_Thread::get_thread_status(carrier_thread);
>> } else {
>>
>> But the `_java_thread` no longer has a carrier, so `get_thread_status` is passed null and we crash.
>>
>> Simple fix is to clear `java_thread` when we find a null carrier oop. Also added an assert to guard against a null carrier oop in the handshake code, and added some additional commentary.
>>
>> Testing:
>> - com/sun/management/HotSpotDiagnosticMXBean/DumpThreads.java
>> - tier 5 and 6
>>
>> Thanks
>
> David Holmes has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains three additional commits since the last revision:
>
> - Remove from ProblemList
> - Merge branch 'master' into 8364314-threadSMR
> - 8364314: java_lang_Thread::get_thread_status fails assert(base != nullptr) failed: Invalid base
For the calls to `tlh.cv_internal_thread_to_JavaThread` in src/hotspot/share/prims/jvm.cpp,
the new logic added by:
[JDK-8361912](https://bugs.openjdk.org/browse/JDK-8361912) ThreadsListHandle::cv_internal_thread_to_JavaThread does not deal with a virtual thread's carrier thread
will allow the carrier JavaThread to be returned to the caller.
However, NONE of the callers in jvm.cpp use a JvmtiVTMSTransitionDisabler
to prevent the virtual thread from being unmounted from the
carrier thread. So at the time of the remainder of the logic in
the JVM calls, the `JavaThread* receiver` may be a stale
carrier thread that no longer has a virtual thread mounted.
I don't know if this is an issue or not.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/26544#issuecomment-3137198268
More information about the hotspot-runtime-dev
mailing list