On Wed, 23 Nov 2022 02:17:43 GMT, Leonid Mesnik <[email protected]> wrote:
>> This problem has two sides.
>> One is that the `VirtualThread::run() `cashes the field `notifyJvmtiEvents`
>> value.
>> It caused the native method `notifyJvmtiUnmountBegin()` not called after the
>> field `notifyJvmtiEvents`
>> value has been set to `true` when an agent library is loaded into running VM.
>> The fix is to get rid of this cashing.
>> Another is that enabling `notifyJvmtiEvents` notifications needs a
>> synchronization.
>> Otherwise, a VTMS transition start can be missed which will cause some
>> asserts to fire.
>> The fix is to use a JvmtiVTMSTransitionDisabler helper for sync.
>>
>> Testing:
>> The originally failed tests are passed now:
>>
>> runtime/vthread/RedefineClass.java
>> runtime/vthread/TestObjectAllocationSampleEvent.java
>>
>> In progress:
>> Run the tiers 1-6 to make sure there are no regression.
>
> src/java.base/share/classes/java/lang/VirtualThread.java line 273:
>
>> 271: private void run(Runnable task) {
>> 272: assert state == RUNNING;
>> 273: boolean notifyJvmti = notifyJvmtiEvents;
>
> Don't we have same issue in yieldContinuation() method? (line 396)
Good point. I'll check and make an update if needed.
Thank you for looking at it.
-------------
PR: https://git.openjdk.org/jdk/pull/11304