On Mon, 20 Nov 2023 00:59:35 GMT, David Holmes <dhol...@openjdk.org> wrote:

>> The stack trace of current thread (where the assert was fired) can explain 
>> what is going on a little bit:
>> 
>> Current thread (0x00007f93f8043d00):  JavaThread "ForkJoinPool-1-worker-1" 
>> daemon [_thread_in_vm, id=16779, 
>> stack(0x00007f948a597000,0x00007f948a697000) (1024K)]
>> 
>> Stack: [0x00007f948a597000,0x00007f948a697000],  sp=0x00007f948a6949e0,  
>> free space=1014k
>> Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native 
>> code)
>> V  [libjvm.so+0x117937d]  
>> JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState*)+0x45d 
>>  (jvmtiEventController.cpp:402)
>> V  [libjvm.so+0x1179520]  
>> JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState*) 
>> [clone .part.0]+0x190  (jvmtiEventController.cpp:632)
>> V  [libjvm.so+0x117a1e1]  
>> JvmtiEventControllerPrivate::thread_started(JavaThread*)+0x351  
>> (jvmtiEventController.cpp:1174)
>> V  [libjvm.so+0x117e608]  
>> JvmtiExport::get_jvmti_thread_state(JavaThread*)+0x98  (jvmtiExport.cpp:424)
>> V  [libjvm.so+0x118a86c]  JvmtiExport::post_field_access(JavaThread*, 
>> Method*, unsigned char*, Klass*, Handle, _jfieldID*)+0x6c  
>> (jvmtiExport.cpp:2214)
>> V  [libjvm.so+0x118b3a1]  JvmtiExport::post_field_access_by_jni(JavaThread*, 
>> oop, Klass*, _jfieldID*, bool)+0x321  (jvmtiExport.cpp:2202)
>> V  [libjvm.so+0x118b4e9]  JvmtiExport::jni_GetField_probe(JavaThread*, 
>> _jobject*, oop, Klass*, _jfieldID*, bool)+0x79  (jvmtiExport.cpp:2168)
>> V  [libjvm.so+0xf83847]  jni_GetStaticBooleanField+0x257  (jni.cpp:2047)
>> C  [libfieldacc02.so+0x379b]  Java_fieldacc02_check+0x6b  (jni.h:1546)
>> j  fieldacc02.check(Ljava/lang/Object;)I+0
>> j  fieldacc02.lambda$testVirtualThread$0()V+12
>> j  fieldacc02$$Lambda+0x00007f943b001428.run()V+0
>> j  java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V+5 
>> java.base@22-internal
>> j  java.lang.VirtualThread.run(Ljava/lang/Runnable;)V+66 
>> java.base@22-internal
>> j  java.lang.VirtualThread$VThreadContinuation$1.run()V+8 
>> java.base@22-internal
>> j  jdk.internal.vm.Continuation.enter0()V+4 java.base@22-internal
>> j  jdk.internal.vm.Continuation.enter(Ljdk/internal/vm/Continuation;Z)V+1 
>> java.base@22-internal
>> J 124  
>> jdk.internal.vm.Continuation.enterSpecial(Ljdk/internal/vm/Continuation;ZZ)V 
>> java.base@22-internal (0 bytes) @ 0x00007f94c7cdf744 
>> [0x00007f94c7cdf5e0+0x0000000000000164]
>> j  jdk.internal.vm.Continuation.run()V+122 java.base@22-internal
>> j  java.lang.VirtualThread.runContinuation()V+70 java.base@22-internal
>> j  java.lang.VirtualThread$$Lambda+0x00007f943b049...
>
> Just to re-iterate what Dan was saying, the TLH is only of use if you are 
> accessing threads known to be included in the TLH.

The issue occurred to be with the current thread which has to be safe to access 
without a TLH.
However, there is this guarantee in the `Hanshake::execute()`:

void Handshake::execute(HandshakeClosure* hs_cl, ThreadsListHandle* tlh, 
JavaThread* target) {
  . . .
  guarantee(target != nullptr, "must be");
  if (tlh == nullptr) {
    guarantee(Thread::is_JavaThread_protected_by_TLH(target),
              "missing ThreadsListHandle in calling context.");

This guarantee fired for current thread is a source of confusion and mistakes.
Would it be a right thing to correct it?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16686#discussion_r1398993572

Reply via email to