> 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 two additional commits since the last revision: - removed a trailing space - addressed one more review round on new test VThreadEventTest ------------- Changes: - all: https://git.openjdk.org/jdk/pull/15467/files - new: https://git.openjdk.org/jdk/pull/15467/files/9f9355df..600974e0 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=15467&range=05 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=15467&range=04-05 Stats: 8 lines in 2 files changed: 1 ins; 3 del; 4 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