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

David Holmes dholmes at openjdk.org
Wed Jul 30 05:20:38 UTC 2025


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

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

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

Changes: https://git.openjdk.org/jdk/pull/26544/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=26544&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8364314
  Stats: 9 lines in 1 file changed: 8 ins; 1 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/26544.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/26544/head:pull/26544

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


More information about the hotspot-runtime-dev mailing list