This update fixes two important issues:
 - Issue reported by a bug submitter about missing JVMTI events on virtual 
threads after an a JVMTI agent dynamic attach
 -  Known scalability/performance issue: a need to lazily create 
`JvmtiThreadState's` for virtual threads

The issue is tricky to fix because the existing mechanism of the JVMTI event 
management does not support unmounted virtual threads. The JVMTI 
`SetEventNotificationMode()` calls the function 
`JvmtiEventControllerPrivate::recompute_enabled()`
which inspects a `JavaThread's` list and for each thread in the list recomputes 
enabled event bits with the function 
`JvmtiEventControllerPrivate::recompute_thread_enabled()`.  The 
`JvmtiThreadState` of each thread is created but only when it is really needed, 
eg, if any of the thread filtered events is enabled. There was an initial 
adjustment of this mechanism for virtual threads which accounted for both 
carrier and virtual threads when a virtual thread is mounted. However, it does 
not work for unmounted virtual threads. A temporary work around was to always 
create `JvmtiThreadState` for each virtual thread eagerly at a thread starting 
point.

This fix introduces new function `JvmtiExport::get_jvmti_thread_state()` which 
checks if thread is virtual and there is a thread filtered event enabled 
globally, and if so, forces a creation of the `JvmtiThreadState`. Another 
adjustment was needed because the function `state_for_while_locked()` can be 
called directly in some contexts. New function 
`JvmtiEventController::recompute_thread_filtered()` was introduced to make 
necessary corrections.

Testing:
 - new test from the bug report was adopted: 
`test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest`
 - ran mach5 tiers 1-6: all are passed

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

Commit messages:
 - 8312174: missing JVMTI events from vthreads parked during JVMTI attach

Changes: https://git.openjdk.org/jdk/pull/15467/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=15467&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8312174
  Stats: 414 lines in 9 files changed: 366 ins; 20 del; 28 mod
  Patch: https://git.openjdk.org/jdk/pull/15467.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/15467/head:pull/15467

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

Reply via email to