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

Chris Plummer chris.plummer at oracle.com
Wed Oct 9 01:21:34 UTC 2019


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