RFR(s): 8235913: ThreadStop should be a handshake

David Holmes david.holmes at oracle.com
Thu Dec 19 22:53:06 UTC 2019


On 20/12/2019 5:20 am, coleen.phillimore at oracle.com wrote:
> 
> I see you're already pushed this, which is fine.  I have a question 
> though.  Why is this a special case?  Why don't we have to do this after 
> all VMThread::execute(&vmop) ?   I was going to see if you could fix the 
> typo here, but too late, so never mind.
> 
>   161   VM_ICBufferFull ibf;
>   162   VMThread::execute(&ibf);
>   163   // We could potential get an async. exception at this point.
>   164   // In that case we will rethrow it to ourselvs.
>   165   if (HAS_PENDING_EXCEPTION) {
>   166     oop exception = PENDING_EXCEPTION;
>   167     CLEAR_PENDING_EXCEPTION;
> 168 JavaThread::current()->set_pending_async_exception(exception);
>   169   }

This code shifts the exception from being a pending exception (that a 
CHECK macro would respond to) to be a "pending async exception" (which 
will only get promoted to being a proper pending exception when specific 
thread-state transitions occur). This allows the calling native code to 
proceed without a pending exception potentially getting in the way.

Presumably this code is special in this regard. In general we would 
handle any pending exception by doing quick returns so that the 
exception will actually reach Java code asap.

David

> Thanks,
> Coleen
> 
> On 12/18/19 6:42 AM, Robbin Ehn wrote:
>> Hi David,
>>
>> On 12/18/19 5:57 AM, David Holmes wrote:
>>> Incremental changes look good. I guess we will see how this works 
>>> out. :)
>>
>> Thanks, yes.
>>
>> (did a t1-5 on inc also)
>>
>> /Robbin
>>
>>>
>>> Thanks,
>>> David
>>>
>>> On 17/12/2019 11:57 pm, Robbin Ehn wrote:
>>>> Hi David,
>>>>
>>>> On 12/17/19 12:39 AM, David Holmes wrote:
>>>>>> I even think send_thread_stop is less error-prone when 'this' is 
>>>>>> the same as Thread::current().
>>>>>
>>>>> I remain concerned when we suddenly will start executing code in 
>>>>> threads that have never before executed this code.
>>>>
>>>> This code is executed when running nsk_jvmti.
>>>>
>>>>>
>>>>>>>
>>>>>>> Do we actually have tests that exercise that particular code 
>>>>>>> path? I'd also check that we test JVM TI stopping of the current 
>>>>>>> thread. (JVM_ThreadStop is not an issue as it already special 
>>>>>>> cases the current thread).
>>>>>>
>>>>>> We have several test that do:
>>>>>> jvmti->StopThread(thread, exception)
>>>>>
>>>>> Yes but the issue is with stopping the current thread.
>>>>>
>>>>> I'm mostly concerned that the refill_ic_stubs() code path may not 
>>>>> be getting tested, or even executed at all given how rarely async 
>>>>> exceptions are used in practice.
>>>>
>>>> If I run nsk_jvmti I hit it like 30 times.
>>>>
>>>>>
>>>>> When a thread executes:
>>>>>
>>>>> Handshake::execute(&vm_stop, target);
>>>>>
>>>>> does that perform any thread-state transitions or related checks 
>>>>> that would install the pending-async-exception as an actual pending 
>>>>> exception? If so that breaks the refill_ic_stubs code.
>>>>
>>>> Both VMThread::execute() and Handshake::execute() adds a VM_op on to 
>>>> VMThread queue and current thread goes to blocked.
>>>> If there is an issue, it should already be present.
>>>> But I think you are correct that there is an issue.
>>>> And I think Martin was correct, we should just re-installed it with:
>>>> set_pending_async_exception
>>>>
>>>> It very hard to hit code path, getting an exception in the safepoint 
>>>> for ic stub
>>>> refill.
>>>>
>>>> Inc:
>>>> http://cr.openjdk.java.net/~rehn/8235913/v2/inc/webrev/
>>>> Full:
>>>> http://cr.openjdk.java.net/~rehn/8235913/v2/full/webrev/
>>>>
>>>> Thanks, Robbin
>>>>
>>>>>
>>>>> Thanks,
>>>>> David
>>>>>
>>>>>> And test like StopAtExit.java which do the java version.
>>>>>>
>>>>>> Thanks, Robbin
>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> David
>>>>>>>
>>>>>>>> Passes t1-7.
>>>>>>>>
>>>>>>>> Thanks, Robbin
> 


More information about the hotspot-runtime-dev mailing list