The `interp-only` mechanism is based on the `JavaThread` objects. Carrier and 
virtual threads can temporary share the same `JavaThread`. The 
`java_thread->jvmti_thread_state()` is re-linked to a virtual thread at `mount` 
and to the carrier thread at `unmount`. The `JvmtiThreadState` has a back link 
to the `JavaThread` which is also set for virtual thread at a `mount` and 
carrier thread at an `unmount`. Just one of these two links at the same time is 
set to the `JavaThread`, the other one has to be set to `nullptr`. The 
`interp-only` mechanism needs this invariant.
However, there is a corner case when this invariant is broken. It happens when 
the `JvmtiThreadState` for carrier thread has just been created. In such case, 
the link to `JavaThread` is always `non-nullptr` even though a virtual thread 
is currently mounted on a carrier thread. This simple update fixes the issue in 
the  `JvmtiThreadState` ctor.

Testing:
 - TBD: Mach5 tiers 1-6

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

Commit messages:
 - 8373367: interp-only mechanism fails to work for carrier threads in a corner 
case

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

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

Reply via email to