On Mon, 11 Sep 2023 21:22:18 GMT, Serguei Spitsyn <[email protected]> wrote:
>> 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:
>
> addressed second round of review comments on VThreadEventTest.java
Marked as reviewed by amenkov (Reviewer).
test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
line 45:
> 43: * The test uses custom implementation of the CountDownLatch class.
> 44: * The reason is we want the state of tested thread to be predictable.
> 45: * With original CountDownLatch it is not clear what thread state is
> expected.
"original CountDownLatch" -> "java.util.concurrent.CountDownLatch"
test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
line 106:
> 104: ready1.countDown(); // to guaranty state is not State.WAITING
> after await(mready)
> 105: try {
> 106: Thread.sleep(20000); // big timeout to keep unmounted untill
> interrupted
untill -> until
test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
line 132:
> 130: // keep mounted
> 131: }
> 132: LockSupport.parkNanos(10 * TIMEOUT_BASE); // will cause extra
> mount and unmount
I don't see much sense in TIMEOUT_BASE constant (it's used only here and
multiplied by 10)
I think it would be clearer to
Suggestion:
// park for 10ms; causes extra unmount and mount
LockSupport.parkNanos(10_000_000L);
test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/libVThreadEventTest.cpp
line 24:
> 22: */
> 23:
> 24: #include <cstdlib>
I suppose this include was needed for abort() only and not needed anymore
test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/libVThreadEventTest.cpp
line 27:
> 25: #include <cstring>
> 26: #include <jvmti.h>
> 27: #include <mutex>
not needed
-------------
PR Review: https://git.openjdk.org/jdk/pull/15467#pullrequestreview-1620911716
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1322125143
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1322125314
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1322134900
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1322138828
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1322135837