RFR: 8329674: JvmtiEnvThreadState::reset_current_location function should use JvmtiHandshake [v2]

Serguei Spitsyn sspitsyn at openjdk.org
Fri Apr 12 01:24:52 UTC 2024


On Thu, 11 Apr 2024 22:54:16 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:

>> src/hotspot/share/prims/jvmtiEnvThreadState.cpp line 367:
>> 
>>> 365:       GetCurrentLocationClosure op;
>>> 366:       JvmtiHandshake::execute(&op, &tlh, thread, thread_h);
>>> 367: 
>> 
>> Seems we are missing a JvmtiVTMSTransitionDisabler.
>
> Good question, thanks.
> The `JvmtiVTMSTransitionDisabler` is supposed to be installed in the caller's context if needed.
> However, it is not easy to make sure it is always the case.
> At least, I see a couple of contexts when the `JvmtiVTMSTransitionDisabler` is not being installed.
> But it is not clear if it is really needed there. Let me do some extra analysis there.

Okay.  The class `GetCurrentLocationClosure` is used by the `reset_current_location` only. It is called for the SINGLE_STEP and REAKPOINT event types as the following assert is placed at the function start:

void JvmtiEnvThreadState::reset_current_location(jvmtiEvent event_type, bool enabled) {
  assert(event_type == JVMTI_EVENT_SINGLE_STEP || event_type == JVMTI_EVENT_BREAKPOINT,
         "must be single-step or breakpoint event");
 . . .

Also, this is the only two places where this function is called:

JvmtiEventControllerPrivate::recompute_env_thread_enabled(JvmtiEnvThreadState* ets, JvmtiThreadState* state) {
    . . .
    if (changed & SINGLE_STEP_BIT) {
      ets->reset_current_location(JVMTI_EVENT_SINGLE_STEP, (now_enabled & SINGLE_STEP_BIT) != 0);
    }
    if (changed & BREAKPOINT_BIT) {
      ets->reset_current_location(JVMTI_EVENT_BREAKPOINT,  (now_enabled & BREAKPOINT_BIT) != 0);
    }

The `reset_current_location` is called called in the context of the `SetEventNotificationMode` where a JvmtiVTMSTransitionDisabler is present.

Theoretically, it can be also triggered by the `SetEventCallbacks` (if callbacks are for SINGLE_STEP or REAKPOINT event type). But it also has a J`vmtiVTMSTransitionDisabler` in place:

JvmtiEnv::SetEventCallbacks(const jvmtiEventCallbacks* callbacks, jint size_of_callbacks) {
  JvmtiVTMSTransitionDisabler disabler;
  JvmtiEventController::set_event_callbacks(this, callbacks, size_of_callbacks);
  return JVMTI_ERROR_NONE;
} /* end SetEventCallbacks */

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

PR Review Comment: https://git.openjdk.org/jdk/pull/18630#discussion_r1561903953


More information about the serviceability-dev mailing list