There are several places in VirtualThread class implementation where virtual 
threads are being mounted or unmounted, so there is a transition of the 
JavaThread identity from carrier thread to virtual thread and back. The 
execution state in such transitions is inconsistent, and so, has to be 
invisible to JVM TI agents. Such transitions are named as VTMS (virtual thread 
mount state) transitions, and there is a JVM TI mechanism which supports them. 
Besides normal VTMS transitions there are also a couple of performance-critical 
contexts (in `VirtualThread` methods: `scheduleUnpark()`, `cancel()` and 
`unpark()`) which can be named as temporary VTMS transitions. Execution state 
of such temporary VTMS transitions has to be also invisible to the JVM TI agent 
which is implemented in the current update.

There are a couple of details of this fix to highlight:
-  A JavaThread which is in temporary VTMS transition is marked with a special 
bit `_is_in_tmp_VTMS_transition`. It is done with the native notification 
method `toggleJvmtiTmpVTMSTrans()`.
- A couple of lambda form classes can be created in context of temporary VTMS 
transitions, so their `ClassLoad`, `ClassPrepare` and `CFLH` events are ignored.
- Suspending threads in temporary transition is allowed.

The fix was tested in Loom repository by using `JTREG_MAIN_WRAPPER=Virtual` 
mode of execution which forces all main threads to be run as virtual. All `JVM 
TI` and `JDI` tests were run on all platforms. It includes `Kitchensink` and 
`JCK` tests. Additionally, the fix was tested in the jdk 20 repository. It 
includes `JVM TI` and `JDI` tests and tiers 1-6.

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

Commit messages:
 -  8293613: need to properly handle and hide tmp VTMS transitions

Changes: https://git.openjdk.org/jdk/pull/10321/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10321&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8293613
  Stats: 56 lines in 10 files changed: 49 ins; 1 del; 6 mod
  Patch: https://git.openjdk.org/jdk/pull/10321.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10321/head:pull/10321

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

Reply via email to