On Wed, 17 Apr 2024 00:29:52 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

> This is a simple fix of three similar asserts.
> The `_target_jt->jvmti_vthread()` has to be used instead of 
> `_target_jt->vthread()`. 
> The `_target_jt->vthread()` can be outdated in some specific contexts as 
> shown in the `hs_err` stack trace.
> 
> I've seen similar issue and already fixed it in this fragment of code:
> 
> class GetCurrentLocationClosure : public JvmtiUnitedHandshakeClosure {
>   . . .
>   void do_vthread(Handle target_h) {
>     assert(_target_jt == nullptr || !_target_jt->is_exiting(), "sanity 
> check");
>     // use jvmti_vthread() as vthread() can be outdated
>     assert(_target_jt == nullptr || _target_jt->jvmti_vthread() == 
> target_h(), "sanity check");
>     . . .
> 
> The issue above was fixed by replacing `_target_jt->vthread()` with 
> `_target_jt->jvmti_vthread()`.
> 
> There are three places which need to be fixed the same way:
>  - `GetSingleStackTraceClosure::do_vthread(Handle target_h)`
>  - `SetForceEarlyReturn::do_vthread(Handle target_h)`
>  - `UpdateForPopTopFrameClosure::do_vthread(Handle target_h)`
> 
> Testing:
>  - Run mach5 tiers 1-6

Looks good. Just small suggestion.

Thanks,
Patricio

src/hotspot/share/prims/jvmtiEnvBase.cpp line 2079:

> 2077: void
> 2078: GetSingleStackTraceClosure::do_vthread(Handle target_h) {
> 2079:   // use jvmti_vthread() as vthread() can be outdated

The only reason I can see of why just using vthread() doesn't work is because 
of the case where we are in a temporary switch to carrier thread. So maybe 
change comment to be: "use jvmti_vthread() instead of vthread() as target couldĀ 
have temporary changed identity to carrier thread (see 
VirtualThread.switchToCarrierThread)". Same in the other places.

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

Marked as reviewed by pchilanomate (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/18806#pullrequestreview-2018092388
PR Review Comment: https://git.openjdk.org/jdk/pull/18806#discussion_r1576768011

Reply via email to