Integrated: 8364314: java_lang_Thread::get_thread_status fails assert(base != nullptr) failed: Invalid base

David Holmes dholmes at openjdk.org
Mon Aug 4 21:51:15 UTC 2025


On Wed, 30 Jul 2025 05:14:29 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

This pull request has now been integrated.

Changeset: 84a4a364
Author:    David Holmes <dholmes at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/84a4a3647c86baecc07abfa7d1d4b88e06984821
Stats:     14 lines in 2 files changed: 11 ins; 3 del; 0 mod

8364314: java_lang_Thread::get_thread_status fails assert(base != nullptr) failed: Invalid base

Reviewed-by: amenkov, shade, dcubed, pchilanomate, sspitsyn

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

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


More information about the hotspot-runtime-dev mailing list