On Tue, 20 Sep 2022 22:15:49 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

>> src/hotspot/share/prims/jvmtiEnvBase.cpp line 713:
>> 
>>> 711:   if (!jt->is_in_tmp_VTMS_transition()) {
>>> 712:     jvf = check_and_skip_hidden_frames(jt, jvf);
>>> 713:   }
>> 
>> I think this comment needs some help. It's hard to match it up with what the 
>> code is doing. I think you are saying you want to avoid skipping hidden 
>> frames when in transition, although if that's the case, it's not clear to me 
>> why not skipping is ok.
>> 
>> Also is skipping (or not skipping) ok regardless of the 
>> JvmtiEnvBase::is_cthread_with_continuation() result?
>
> Thank you for reviewing and the comment, Chris.
> I agree, this part and related comment is kind of obscure.
> I'll think how to make the comment better.
> In fact, all temporary VTMS transitions do temporary switch the `JavaThread` 
> identity from virtual thread to carrier. There is no need to skip frames 
> because there are no real carrier thread frames at the top. Moreover, any 
> attempt to skip frames which are in transition works incorrectly and gives an 
> empty stack. The check `JvmtiEnvBase::is_cthread_with_continuation()` is 
> needed to make sure we have a deal with a continuation. There is no need to 
> skip frames otherwise.

It's still not clear to me if the result of 
`JvmtiEnvBase::is_cthread_with_continuation()` impacts if you have to possibly 
skip hidden frames. In other words, do you always have to do the `if` block 
that follows, no matter what `JvmtiEnvBase::is_cthread_with_continuation()` 
returns? If you don't, then maybe instead of a "? :"  expression, an if/else 
would be better. I'm not sure if the following is correct, but something like:

    javaVFrame *jvf;
    if (JvmtiEnvBase::is_cthread_with_continuation(jt)) {
      jvf = jt->carrier_last_java_vframe(reg_map_p);
    } else {
      jvf - jt->last_java_vframe(reg_map_p);
      // Skipping hidden frames when jt->is_in_tmp_VTMS_transition()==true 
results
      // in returning jvf==NULL, and so, empty stack traces for carrier threads.
      if (!jt->is_in_tmp_VTMS_transition()) {
        jvf = check_and_skip_hidden_frames(jt, jvf);
      }
    }

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

PR: https://git.openjdk.org/jdk/pull/10321

Reply via email to