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

Serguei Spitsyn sspitsyn at openjdk.org
Fri Feb 27 04:50:33 UTC 2026


On Tue, 27 Jan 2026 01:48:03 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:

> 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.
> 
> Also, this update the includes the `interp_only` implementation simplifications and more asserts are added to relevant places. One of the simplification is a removal of the field `JvmtiThreadState::_thread_saved`.
> 
> Testing:
>  - TBD: Mach5 tiers 1-6

This pull request has now been integrated.

Changeset: dc06fede
Author:    Serguei Spitsyn <sspitsyn at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/dc06fede2af2f10011695b0539b6f4d2cb1f07df
Stats:     81 lines in 7 files changed: 29 ins; 20 del; 32 mod

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

Reviewed-by: amenkov, lmesnik

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

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


More information about the serviceability-dev mailing list