On Tue, 28 May 2024 22:24:53 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

> Please, review the following `interp-only` issue related to carrier threads.
> There are 3 problems fixed here:
>  - The  `EnterInterpOnlyModeClosure::do_threads` is taking the 
> `JvmtiThreadState` with the `jt->jvmti_thread_state()` which is incorrect 
> when we have a deal with a carrier thread. The target state is known at the 
> point when the `HandshakeClosure` is set, so the fix is to pass it as a 
> constructor parameter.
>  - The `state->is_pending_interp_only_mode())` was processed at mounts only 
> but it has to be processed for unmounts as well. 
>  - The test 
> `test/hotspot/jtreg/serviceability/jvmti/vthread/MethodExitTest/libMethodExitTest.cpp`
>  has a wrong assumption that there can't be `MethodExit` event on the carrier 
> thread when the function `breakpoint_hit1` is being executed. However, it can 
> happen if the virtual thread gets unmounted.
>  
>  The fix also includes new test case `vthread/CarrierThreadEventNotification` 
> developed by Patricio.
>  
>  Testing:
>  - Ran new test case locally
>  - Ran mach5 tiers 1-6

test/hotspot/jtreg/serviceability/jvmti/vthread/CarrierThreadEventNotification/CarrierThreadEventNotification.java
 line 2:

> 1: /*
> 2:  * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.

(c) 2024

test/hotspot/jtreg/serviceability/jvmti/vthread/CarrierThreadEventNotification/libCarrierThreadEventNotification.cpp
 line 2:

> 1: /*
> 2:  * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.

(c) 2024

test/hotspot/jtreg/serviceability/jvmti/vthread/CarrierThreadEventNotification/libCarrierThreadEventNotification.cpp
 line 40:

> 38: 
> 39: static const char* CTHREAD_NAME_START = "ForkJoinPool";
> 40: static const int CTHREAD_NAME_START_LEN = (int)strlen("ForkJoinPool");

should be `size_t` (the value is used for `strncmp` which expects `size_t`)

test/hotspot/jtreg/serviceability/jvmti/vthread/CarrierThreadEventNotification/libCarrierThreadEventNotification.cpp
 line 44:

> 42: static jint
> 43: get_cthreads(JNIEnv* jni, jthread** cthreads_p) {
> 44:   jthread* tested_cthreads = NULL;

Suggestion:

  jthread* tested_cthreads = nullptr;

test/hotspot/jtreg/serviceability/jvmti/vthread/CarrierThreadEventNotification/libCarrierThreadEventNotification.cpp
 line 44:

> 42: static jint
> 43: get_cthreads(JNIEnv* jni, jthread** cthreads_p) {
> 44:   jthread* tested_cthreads = NULL;

This local variable has the same name as global.
I'd suggest to rename the local var or remove it (and the function should set 
both `tested_cthreads` and ` cthread_cnt`)

test/hotspot/jtreg/serviceability/jvmti/vthread/CarrierThreadEventNotification/libCarrierThreadEventNotification.cpp
 line 91:

> 89:     for (int i = 0; i < cthread_cnt; i++) {
> 90:       jthread thread = tested_cthreads[i];
> 91:       char* tname = get_thread_name(jvmti, jni, thread);

`tname` is not needed

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19438#discussion_r1619642814
PR Review Comment: https://git.openjdk.org/jdk/pull/19438#discussion_r1619642981
PR Review Comment: https://git.openjdk.org/jdk/pull/19438#discussion_r1619643931
PR Review Comment: https://git.openjdk.org/jdk/pull/19438#discussion_r1619660102
PR Review Comment: https://git.openjdk.org/jdk/pull/19438#discussion_r1619662506
PR Review Comment: https://git.openjdk.org/jdk/pull/19438#discussion_r1619665290

Reply via email to