On Tue, 30 Jul 2024 23:13:23 GMT, Serguei Spitsyn <[email protected]> wrote:
> The test has been fixed to:
> - add a guard against JVMTI_ERROR_WRONG_PHASE
> - replace `exit(err)` with `abort()` in the `check_jvmti_error()`
>
> The JVMTI `VMDeath` event is enabled and a `RawMonitor` is introduced to
> serialize `ClassPrepare` and `VMDeath` events, and so, to prevent
> JVMTI_ERROR_WRONG_PHASE in the `ClassPrepare` events.
>
> Testing:
> - run the test AllowedFunctions.java locally
> - TBD: submit a mach5 run for fixed test
test/hotspot/jtreg/serviceability/jvmti/StartPhase/AllowedFunctions/libAllowedFunctions.c
line 358:
> 356:
> 357: // Block VMDeath event and other ClassPrepare events while this
> callback is executed.
> 358: // Sync with VMDeath event guards agains JVMTI_ERROR WRONG_PHASE.
Suggestion:
// Sync with VMDeath event guards agains JVMTI_ERROR_WRONG_PHASE.
test/hotspot/jtreg/serviceability/jvmti/StartPhase/AllowedFunctions/libAllowedFunctions.c
line 359:
> 357: // Block VMDeath event and other ClassPrepare events while this
> callback is executed.
> 358: // Sync with VMDeath event guards agains JVMTI_ERROR WRONG_PHASE.
> 359: err = (*jvmti)->RawMonitorEnter(jvmti, event_mon);
I don't see how this fixes the problem. You can be exiting VMDeath when this
monitor is entered. This does not block the get_thread_local() call below,
which is what leads to the WRONG_PHASE. I think using a raw monitor is the
right approach, but I was expecting to see VMDeath set a flag after grabbing
the monitor that indicated VMDeath had been called. Then ClassPrepare should
check this flag after grabbing the monitor and ignore the event if it is set.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/20397#discussion_r1700920905
PR Review Comment: https://git.openjdk.org/jdk/pull/20397#discussion_r1700920369