RFR 8153629: Need to cover JVMTI's GetOwnedMonitorStackDepthInfo function

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Wed Jan 17 20:21:57 UTC 2018


Hi Daniil,


Some nits.

  207     if (monitorCount == 3) {
  208         for (idx = 0; idx < 3; idx++) {

   Need to get rid of hardcoded number of monitors (3).

  184     err = (*jvmti) -> GetCurrentThread(jvmti, &thread);

   Extra spaces around '->'.

  214                             TEST_CLASS, TEST_OBJECT_LOCK_DEPTH,stackDepthInfo[idx].stack_depth);
  221                             LOCK1_CLASS, LOCK1_DEPTH,stackDepthInfo[idx].stack_depth);

   Missed a space before stackDepthInfo[...
  


Also, I have more suggestions to add to the Chris's comment:

   - Remove the big condition if (monitorCount == 3) around the loop and 
replace it with:
       for (idx = 0; idx < monitorCount; idx++) {

     and print monitor miscount separately before of after the loop:
      if (monitorCount != 3) {
        fprintf(stderr, "VerifyOwnedMonitors: FAIL: invalid 
monitorCount, expected: %d, found: %d.\n",
                        3, monitorCount);
      }


Then it would look like this:

     status = PASSED;
     if (monitorCount != EXP_MON_COUNT) {
         fprintf(stderr, "VerifyOwnedMonitors: FAIL: invalid monitorCount, expected: %d, found: %d.\n",
                 EXP_MON_COUNT, monitorCount);
         status = FAILED;
     }
     for (idx = 0; idx < monitorCount; idx++) {
         if (CheckLockObject(env, stackDepthInfo[idx].monitor, testClass) == JNI_TRUE) {
             if (stackDepthInfo[idx].stack_depth != TEST_OBJECT_LOCK_DEPTH) {
                  fprintf(stderr, "FAILED: invalid stack_depth for %s monitor, expected: %d, found: %d.\n",
                          TEST_CLASS, TEST_OBJECT_LOCK_DEPTH, stackDepthInfo[idx].stack_depth);
                  status = FAILED;
              }
          } else if (CheckLockObject(env, stackDepthInfo[idx].monitor, lock1Class) == JNI_TRUE) {
              if (stackDepthInfo[idx].stack_depth != LOCK1_DEPTH) {
                  fprintf(stderr, "FAILED: invalid stack_depth for %s monitor, expected: %d, found: %d.\n",
                          LOCK1_CLASS, LOCK1_DEPTH,stackDepthInfo[idx].stack_depth);
                  status = FAILED;
              }
          } else if (CheckLockObject(env, stackDepthInfo[idx].monitor, lock2Class) == JNI_TRUE) {
              if (stackDepthInfo[idx].stack_depth != LOCK2_DEPTH) {
                  fprintf(stderr, "FAILED: invalid stack_depth for %s monitor, expected: %d, found: %d.\n",
                          LOCK2_CLASS, LOCK2_DEPTH, stackDepthInfo[idx].stack_depth);
                  status = FAILED;
              }
          } else {
              fprintf(stderr, "FAILED: monitor[%d] should be instance of %s, %s, or %s\n",
                      idx, TEST_CLASS, LOCK1_CLASS, LOCK2_CLASS);
              status = FAILED;
          }
      }

Also, it does not seem that important to have two different lock classes Lock1 and Lock2.
Would it be simpler to keep just one of them?

Thanks,
Serguei


On 1/17/18 11:29, Chris Plummer wrote:
> Hi Daniil,
>
> Have you run with -Xcomp. I'm concerned that inlining will cause the 
> test to fail because stack depths will not be as expected. Also, if 
> you find the owned monitor, but the depth is not as expected, I think 
> you are better off printing an error message right away rather than 
> the somewhat misleading "FAIL: invalid number of %s monitors" message 
> later on.
>
> thanks,
>
> Chris
>
> On 1/16/18 6:31 PM, Daniil Titov wrote:
>> Hello,
>>
>> Please review  an updated fix that makes the test more extensive and 
>> includes suggested changes.
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8153629
>> Webrev: http://cr.openjdk.java.net/~dtitov/8153629/webrev.02/
>>
>> Thank you!
>>
>> Best regards,
>> Daniil
>>
>> On 1/12/18, 2:26 PM, "serguei.spitsyn at oracle.com" 
>> <serguei.spitsyn at oracle.com> wrote:
>>
>>      Hi Daniil,
>>           It is pretty good in general.
>>      Thank you for taking care about it!
>>           Some comments though.
>>           The test case is too trivial.
>>      I'd suggest to extend it to have at least a couple of locks in the
>>      returned array.
>>      One way to do it would be to add a instance synchronized method and
>>      invoke it from the synchronized statement of the tested Thread.
>>      Then the verifyOwnedMonitors() can be invoked from this method.
>>           A couple of comments on the native agent.
>>           72         // JNI_OnLoad has not been called yet, so can't 
>> possibly be an instance of TEST_CLASS.
>>           Could you, please, rewrite this comment?
>>      Maybe just tell that there probably was an error in loading the 
>> TEST_CLASS.
>>      What about moving the FindClass(env, TEST_CLASS) to the
>>      verifyOwnedMonitors() function?
>>      It will make the testClass variable local.
>>             200                 fprintf(stderr, "VerifyOwnedMonitors: 
>> FAIL: stackDepthInfo[0].stack_depth should be 1.\n");
>>             207         fprintf(stderr, "VerifyOwnedMonitors: FAIL: 
>> monitorCount should be 1.\n");
>>                It'd better to rephrase the messages above to tell 
>> about actual values
>>      vs expected.
>>      It normally simplifies the analysis of failures as there is no 
>> need to find
>>      what values were printed before and that they are exactly what 
>> needed
>>      for comparison.
>>           Thanks,
>>      Serguei
>>                     On 1/11/18 17:45, Daniil Titov wrote:
>>      > Hello,
>>      >
>>      > Please review the following fix that adds a jtreg test for 
>> GetOwnedMonitorStackDepthInfo JVMTI function.
>>      >
>>      > Bug: https://bugs.openjdk.java.net/browse/JDK-8153629
>>      > Webrev: http://cr.openjdk.java.net/~dtitov/8153629/webrev.00
>>      >
>>      >
>>      > The tests ran successfully with Mach5.
>>      >
>>      > Best regards,
>>      > Daniil
>>      >
>>      >
>>
>>
>



More information about the serviceability-dev mailing list