On Mon, 11 Sep 2023 21:22:18 GMT, Serguei Spitsyn <sspit...@openjdk.org> 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

Reply via email to