On Fri, 18 Nov 2022 04:55:10 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

>> 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)`.
> 
> The conclusion is that the 
> `java_lang_VirtualThread::init_static_notify_jvmti_events()` is always called 
> at startup (single-threaded execution mode) after load of all the agents.
> In opposite, all calls to `get_jvmti_interface()` from the `AgentOnAttach` 
> entry points have to in context of attached threads. I'm thinking if we could 
> add an assert to ensure it is always the case.
> We can add a comment on this but I'm puzzled on how to make it clear and 
> simple.

If there are no command line agents, then on startup 
`vthread_notify_jvmti_events` is not set true. Because it is not true, when 
`javaClasses_init()` calls `init_static_notify_jvmti_events()`, it does 
nothing. The whole point of the code we are reviewing here is to make sure 
`init_static_notify_jvmti_events()` is called while 
`vthread_notify_jvmti_events == true` so it actually does something. However, 
the code here does not bother calling `init_static_notify_jvmti_events()` if 
the current thread is detached, but it does still set 
`vthread_notify_jvmti_events = true`. This means that if this code gets called 
a second time, this time with the current thread attached, it will not call 
`init_static_notify_jvmti_events()` due to `vthread_notify_jvmti_events == 
true`, but it seems it should be calling it.

What I believe to be the flaw here is that you call 
`set_notify_jvmti_events(true)` even if you don't call 
`init_static_notify_jvmti_events()`.

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

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

Reply via email to