On Fri, 18 Nov 2022 03:43:34 GMT, Chris Plummer <cjplum...@openjdk.org> wrote:

>> If `notify_jvmti_events()` is false, then you call 
>> `set_notify_jvmti_events(true)`, which means you will never enter the `if` 
>> block again. However, if the thread is not attached,  you do not call 
>> `init_static_notify_jvmti_events()`. What happens if later there is an 
>> attached thread that triggers this code? Is seem when that happens you 
>> should call `init_static_notify_jvmti_events()`, but won't because 
>> `notify_jvmti_events()` is true.
>
> I think you need a flag that tells you if `init_static_notify_jvmti_events()` 
> has been called.

A part of the initialization sequence we need to know is:

create_vm()  {
  . . .
  // Launch -agentlib/-agentpath and converted -Xrun agents
  if (Arguments::init_agents_at_startup()) {
    create_vm_init_agents();  =>  {
       <loads all agents and calls AgentOnLoad entry points>  =>
        get_jvmti_interface() => set_notify_jvmti_events(true)
  }
  . . .
  init_globals() => javaClasses_init() => 
java_lang_VirtualThread::init_static_notify_jvmti_events()

The `create_vm_init_agents()` is called in the context of unattaching thread.
In this context a call to 
`java_lang_VirtualThread::init_static_notify_jvmti_events()` is guaranteed to 
happen after all the agents were successfully loaded at startup and executed 
their `AgentOnLoad` entree points which make calls to `vm->GetEnv()` that 
transitively call to `get_jvmti_interface()` and 
`java_lang_VirtualThread::set_notify_jvmti_events(true)`.

We can add a comment on this but I'm puzzled on how to make it clear and simple.

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

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

Reply via email to