> 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

Serguei Spitsyn has updated the pull request incrementally with one additional 
commit since the last revision:

  1) addressed review comments; 2) replaced is_virtual with is_vthread_mounted

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/15467/files
  - new: https://git.openjdk.org/jdk/pull/15467/files/dd97dacc..6cf97ef9

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=15467&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=15467&range=01-02

  Stats: 191 lines in 8 files changed: 80 ins; 57 del; 54 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