RFR (M): 8231595 [TEST] develop a test case for SuspendThreadList including current thread

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Wed Oct 9 05:43:12 UTC 2019


Hi Chris and Alex,

I discussed this with Alex before preparing and sending this webrev.
We considered to use a mutex but then I decided that using a raw monitor 
is better.

Thanks,
Serguei


On 10/8/19 18:21, Chris Plummer wrote:
> It's not really being used as a mutex. It's being used as completion 
> flag to ensure proper ordering. That's why I thought it odd.
>
> Chris
>
> On 10/8/19 6:07 PM, Alex Menkov wrote:
>> Hi Chris,
>>
>> Actually this "lock" is used as a mutex.
>> So agent_lock acquires the mutex, agent_unlock releases the mutex.
>>
>> Serguei,
>>
>> The fix looks good to me.
>>
>> Some cosmetic notes (updated webrev is not required):
>>
>> SuspendWithCurrentThread.java
>>
>> 52     public static void main(String args[]) throws Exception {
>>
>> please make it java-style: "String[] args"
>>
>> 79         ThreadToSuspend[]threads = new ThreadToSuspend[threadsCount];
>>
>> missed space: ThreadToSuspend[] threads
>>
>> --alex
>>
>> On 10/08/2019 12:56, Chris Plummer wrote:
>>> Hi Serguei,
>>>
>>> The just seems like an odd coding pattern to me:
>>>
>>>    // Block until the suspender thread competes the tested threads 
>>> suspension
>>>    agent_lock(jni);
>>>    agent_unlock(jni);
>>>
>>> Wouldn't you normally use wait/notify in this situation? Some like:
>>>
>>>    agent_lock(jni);
>>>    if (!suspenderDone) {
>>>      agent_wait(jni);
>>>    }
>>>    agent_unlock(jni);
>>>
>>> I think maybe you left out the middle part because you know that 
>>> this code will never grab the agent_lock before the suspender thread 
>>> does, and therefore once this code gets the lock you know the 
>>> suspender thread is done (is that actually the case?).
>>>
>>> thanks,
>>>
>>> Chris
>>>
>>> On 10/8/19 11:50 AM, serguei.spitsyn at oracle.com wrote:
>>>> Ping...
>>>>
>>>> Thanks,
>>>> Serguei
>>>>
>>>> On 10/7/19 5:25 PM, serguei.spitsyn at oracle.com wrote:
>>>>> On 10/7/19 17:14, serguei.spitsyn at oracle.com wrote:
>>>>>> Hi Alex, Chris and David,
>>>>>>
>>>>>> The mach5 testing in 100 runs loop on all platform discovered a 
>>>>>> race in new test.
>>>>>> It is between the native suspendTestedThreads() called on the 
>>>>>> suspender thread
>>>>>> and the checkSuspendedStatus() calling native 
>>>>>> checkTestedThreadsSuspended().
>>>>>>
>>>>>> It occurred that the iteration count and sleep time in 
>>>>>> checkSuspendedStatus() can be not enough:
>>>>>>   100     private boolean checkSuspendedStatus(ThreadToSuspend[] 
>>>>>> threads) throws RuntimeException  {
>>>>>>   101         boolean success = false;
>>>>>>   102
>>>>>>   103         log("Main: checking all tested threads have been 
>>>>>> suspended");
>>>>>>   104
>>>>>>   105         // wait for tested threads to reach suspended status
>>>>>>   106         for (int i = 0; !success && i < 20; i++) {
>>>>>>   107             try {
>>>>>>   108                 Thread.sleep(10);
>>>>>>   109             } catch (InterruptedException e) {
>>>>>>   110               throw new RuntimeException("Main: sleep was 
>>>>>> interrupted\n\t" + e);
>>>>>>   111             }
>>>>>>   112             success = checkTestedThreadsSuspended();
>>>>>>   113         }
>>>>>>   114         return success;
>>>>>>   115     }
>>>>>>
>>>>>> So, I've decided to refactor/update the test a little bit:
>>>>>>
>>>>>> 1. Now the checkSuspendedStatus() is:
>>>>>>   100     private boolean checkSuspendedStatus() throws 
>>>>>> RuntimeException  {
>>>>>>   101         log("Main: checking all tested threads have been 
>>>>>> suspended");
>>>>>>   102         return checkTestedThreadsSuspended();
>>>>>>   103     }
>>>>>> 2. A raw monitor agent_monitor is added to the native agent.
>>>>>>    It is created and locked in the Java_ThreadToSuspend_init() 
>>>>>> function called at
>>>>>>    the beginning of the ThreadToSuspend.run() execution of the 
>>>>>> suspender thread
>>>>>>    and unlocked at the end of 
>>>>>> Java_ThreadToSuspend_suspendTestedThreads().
>>>>>>
>>>>>>    The 
>>>>>> Java_SuspendWithCurrentThread_checkTestedThreadsSuspended() grabs 
>>>>>> the agent_monitor
>>>>>>    on the Main thread to wait until the suspendTestedThreads() 
>>>>>> completes its work.
>>>>>>
>>>>>> 3. Also, the results[] array is always created and used locally 
>>>>>> in the functions
>>>>>>    where it is needed: suspendTestedThreads() and 
>>>>>> resumeTestedThreads().
>>>>>
>>>>> Forgot to tell about one more change:
>>>>>
>>>>> 4. The releaseTestedThreads() is renamed to 
>>>>> releaseTestedThreadsInfo() and moved
>>>>>    to the end of the Main thread run() method.
>>>>>
>>>>> Also wanted to thank Alex for sharing good suggestions on the sync 
>>>>> approaches.
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>>
>>>>>> Updated webrev version:
>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2019/8231595-jvmti-susp-tlist.4/ 
>>>>>>
>>>>>>
>>>>>>
>>>>>> Testing:
>>>>>>   One mach5 run with 100 rep counter successfully passed.
>>>>>>   To be more confident, I've submitted one more mach5 job which 
>>>>>> is in progress.
>>>>>>
>>>>>> Thanks,
>>>>>> Serguei
>>>>>
>>>>
>>>
>
>



More information about the serviceability-dev mailing list