RFR(S): JDK-8059038 Create new launcher for SA tools

Dmitry Samersoff dmitry.samersoff at oracle.com
Fri Jul 17 15:10:47 UTC 2015


Serguei,

Thank you for review.

> The following fragment has the same invariant for both branches:

fixed. (webrev updated in-place, diff to webrev.06.old is attached)

> One more suggestion would be to refactor the if (_optreset) { ... }
> with a cal to a new method optReset().

I would prefer to leave it as is.

The parser reaches one of *tree* sates after optReset:
{end_of_processing, processLongOptions_result,
need_to_process_short_options}
so refactoring it to a separate method adds extra complication.

-Dmitry


On 2015-07-17 17:29, serguei.spitsyn at oracle.com wrote:
> Dmitry,
> 
> Thanks for new webrev!
> 
> A couple of comments on 
> hotspot_webrev/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java
> 
> The following fragment has the same invariant for both branches:
> 
>  136             ch = carg.charAt(_optopt);
>  137         }
>  138         else {
>  139             ch = carg.charAt(_optopt);
>  140         }
> 
> It can be replaced with:
> 
>              }
>              ch = carg.charAt(_optopt);
> 
>  
> One more suggestion would be to refactor the if (_optreset) { ... } with a cal to a new method optReset().
> 
> But I leave it up to you.
> Thumbs up from me.
> 
> 
> Thanks,
> Serguei
> 
> 
> On 7/17/15 7:13 AM, Dmitry Samersoff wrote:
>> Serguei,
>>
>> Sorry for typeo
>>
>> new webrev:
>> http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.06
>>
>> -Dmitry
>>
>>
>> On 2015-07-17 16:28, serguei.spitsyn at oracle.com wrote:
>>> On 7/17/15 6:21 AM, Dmitry Samersoff wrote:
>>>> Serguei,
>>>>
>>>> new webrev:
>>>>
>>>> http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.05
>>> The webrev is the same.
>>> I do not see the changes you claim below.
>>> Could you, please, generate a webrev with another version number?
>>>
>>>
>>> Thanks,
>>> Serguei
>>>
>>>> diff to webrev.05.old attached
>>>>
>>>> please see also below.
>>>>
>>>> On 2015-07-17 13:46, serguei.spitsyn at oracle.com wrote:
>>>>> Dmitry,
>>>>>
>>>>> Thanks for the diff, it helps!
>>>>>
>>>>> hotspot_webrev/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java
>>>>>
>>>>> Uninitialized local definition:
>>>>>
>>>>>   105         char ch;
>>>> changed. ch is initialized later, so we actually don't need it.
>>>>
>>>>
>>>>> Unneded second initialization at 111:
>>>>>   104         String carg = _argv[_optind];
>>>>>   111             carg = _argv[_optind];
>>>> fixed.
>>>>
>>>>> It is not clear why carg can't be empty:
>>>>>
>>>>>    61         // _argv[_optind] can't be empty, so it's safe to
>>>>> expect at least one character
>>>>>    62         if (_argv[_optind].charAt(0) == '-') {
>>>>>   ...
>>>>>
>>>>>   113             // carg can't be empty so it's safe to expect at
>>>>> least one character
>>>>>   114             if (carg.charAt(0) != '-' || carg.equals("--")) {
>>>> changed.
>>>>
>>>> An array passed to getopt is result of splitting arguments string, so no
>>>> empty array element possible. But changed it to be on safe side.
>>>>
>>>>> The _argv comes from outside of the method.
>>>>> How can we be sure that the value _argv[_optind] is not empty String?
>>>>> Does it comes from an assumption that the outside processing works
>>>>> correctly?
>>>>> Would it be better to always check that it is not empty?
>>>>>
>>>>>
>>>>> It feels like this code is not clear and more complex than has to be.
>>>>> But I can't tell yet what has to be simplified.
>>>>>
>>>>> For example, I do not like this part:
>>>>>    37     private boolean _optreset; // special handling of first call
>>>>>
>>>>>    44         _optreset = true;
>>>>>
>>>>>   108         if (_optreset) {
>>>>>
>>>>>   138             _optreset = false;
>>>>>
>>>>>
>>>>> Would it be better to separate this first step from the next() method
>>>>> and make it a separate method that is called reset() or init()?
>>>> Reset called every time when we finish the option batch:
>>>>
>>>> prog -xzvf filename /*reset here*/ -abc
>>>>
>>>>> Also, there is no clue why all this is necessary.
>>>> This is a port of standard BSD getopt (based on C++ code I wrote back in
>>>> 2004), that takes care of all possible option combinations and allow to
>>>> process it uniform way.
>>>>
>>>> I would love to have it JDK-wide instead of a separate parser for each
>>>> tool.
>>>>
>>>>> Other files look good to me.
>>>>> Do you have another reviewer?
>>>> Stefan Larsen reviewed one of the previous versions.
>>>>
>>>> -Dmitry
>>>>
>>>>>
>>>>> On 7/17/15 2:46 AM, Dmitry Samersoff wrote:
>>>>>> Serguei,
>>>>>>
>>>>>> Previous webrev is:
>>>>>> http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.05.old
>>>>>>
>>>>>> Latest webrev is:
>>>>>> http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.05
>>>>>>
>>>>>> Diff between webrev.05.old and webrev.05 attached
>>>>>>
>>>>>> -Dmitry
>>>>>>
>>>>>> On 2015-07-17 01:00, serguei.spitsyn at oracle.com wrote:
>>>>>>> Hi Dmitry,
>>>>>>>
>>>>>>> I do not see any changes.
>>>>>>> Could you please, generate .06 version ?
>>>>>>> In such a case, it will be much easier to compare the code.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Serguei
>>>>>>>
>>>>>>> On 7/16/15 8:23 AM, Dmitry Samersoff wrote:
>>>>>>>> Serguei,
>>>>>>>>
>>>>>>>> http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.05
>>>>>>>>
>>>>>>>> Webrev updated in-place (press shift-reload).
>>>>>>>>
>>>>>>>> Code changes at ll.119.
>>>>>>>>
>>>>>>>> Added more comments to other places.
>>>>>>>>
>>>>>>>> -Dmitry
>>>>>>>>
>>>>>>>> On 2015-06-27 03:15, serguei.spitsyn at oracle.com wrote:
>>>>>>>>> Hi Dmitry,
>>>>>>>>>
>>>>>>>>> Thank you for the update!
>>>>>>>>> The SALauncher.java changes are really nice.
>>>>>>>>> I have just couple of small comments.
>>>>>>>>>
>>>>>>>>> agent/src/share/classes/sun/jvm/hotspot/SALauncher.java
>>>>>>>>>
>>>>>>>>>    343         // Run tmtools
>>>>>>>>>    344         if (args[0].equals("jstack")) {
>>>>>>>>>    345             runJSTACK(oldArgs);
>>>>>>>>>
>>>>>>>>>    Why the comment says "Run tmtools", not jstack?
>>>>>>>>>    BTW, other fragments have no such a comment which is Ok at it is
>>>>>>>>> obvious.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java
>>>>>>>>>
>>>>>>>>> There are no checks of the carg length in several places where it is
>>>>>>>>> needed:
>>>>>>>>>
>>>>>>>>>     61         if (_argv[_optind].charAt(0) == '-') {
>>>>>>>>>
>>>>>>>>>    112             if (carg.charAt(0) != '-' || carg.equals("--")) {
>>>>>>>>>    117             if (carg.charAt(0) == '-' && carg.charAt(1) ==
>>>>>>>>> '-') {
>>>>>>>>>    124                 carg = carg.substring(2);
>>>>>>>>>
>>>>>>>>>    136             ch = carg.charAt(_optopt);
>>>>>>>>>    139             ch = carg.charAt(_optopt);
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Otherwise, the fix looks good.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Serguei
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 6/24/15 5:37 AM, Dmitry Samersoff wrote:
>>>>>>>>>> Serguei,
>>>>>>>>>>
>>>>>>>>>> Thank you for the review.
>>>>>>>>>>
>>>>>>>>>> New webrev is here:
>>>>>>>>>>
>>>>>>>>>>     http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.05/
>>>>>>>>>>
>>>>>>>>>> I didn't change naming convention in SAGetoptTest.java and keep
>>>>>>>>>> a_opt,
>>>>>>>>>> b_opt etc as it gives better readability. Other concerns are
>>>>>>>>>> addressed.
>>>>>>>>>>
>>>>>>>>>> BasicLauncherTest changed to use LingeredApp from testlib.
>>>>>>>>>>
>>>>>>>>>> -Dmitry
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 2015-06-24 08:32, serguei.spitsyn at oracle.com wrote:
>>>>>>>>>>> Hi Dmitry,
>>>>>>>>>>>
>>>>>>>>>>> Some quick minor comments.
>>>>>>>>>>>
>>>>>>>>>>> hotspot_webrev/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Formatting is wrong:
>>>>>>>>>>>
>>>>>>>>>>>     57         if (_optind >_argv.length) {
>>>>>>>>>>>
>>>>>>>>>>>     71       String[] ca = carg.split("=",2);
>>>>>>>>>>>
>>>>>>>>>>>     80       if (los.contains(ca[0]+"=")) {
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Need to use camel case for java method names:
>>>>>>>>>>>
>>>>>>>>>>>     55   private void extract_optarg(String opt) {
>>>>>>>>>>>
>>>>>>>>>>>     69   private String process_long_options(String carg, String[]
>>>>>>>>>>> longOptStr) {
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Need to use quotes for '-':
>>>>>>>>>>>
>>>>>>>>>>>    109           // End of option batch like -abc reached, expect
>>>>>>>>>>> option to start from -
>>>>>>>>>>>
>>>>>>>>>>> Example is:
>>>>>>>>>>>
>>>>>>>>>>>    133           // At this point carg[0] contains '-'
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Wrong indent at 87, 139, 120-121:
>>>>>>>>>>>
>>>>>>>>>>>     85         else {
>>>>>>>>>>>     86             // Mixed style options --file name
>>>>>>>>>>>     87           extract_optarg(ca[0]);
>>>>>>>>>>>     88         }
>>>>>>>>>>>
>>>>>>>>>>>    138       else {
>>>>>>>>>>>    139         ch = carg.charAt(_optopt);
>>>>>>>>>>>    140       }
>>>>>>>>>>>
>>>>>>>>>>>    119               if (longOptStr == null ||
>>>>>>>>>>> longOptStr.length ==
>>>>>>>>>>> 0) {
>>>>>>>>>>>    120                    // No long options specified, stop
>>>>>>>>>>> options
>>>>>>>>>>> processing
>>>>>>>>>>>    121                    return null;
>>>>>>>>>>>    122               }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> hotspot_webrev/agent/src/share/classes/sun/jvm/hotspot/SALauncher.java
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Uninitialized local:
>>>>>>>>>>>
>>>>>>>>>>>    128         String s;
>>>>>>>>>>>
>>>>>>>>>>> Need to use camel case:
>>>>>>>>>>>
>>>>>>>>>>>    126         String exe_or_pid = null;
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> The main method is too long, I'd suggest to split with the
>>>>>>>>>>> sub-methods for:
>>>>>>>>>>>     clhsdb, hsdb, jstack, jmap, jinfo
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> jdk_webrev/test/sun/tools/jhsdb/BasicLauncherTest.java
>>>>>>>>>>>
>>>>>>>>>>> Wrong indent at 82, 85:
>>>>>>>>>>>
>>>>>>>>>>>     80                 return toolProcess.exitValue();
>>>>>>>>>>>     81             } finally {
>>>>>>>>>>>     82                   theApp.stopApp();
>>>>>>>>>>>     83             }
>>>>>>>>>>>     84         } catch (IOException | InterruptedException ex) {
>>>>>>>>>>>     85                throw new RuntimeException("Test ERROR "
>>>>>>>>>>> + ex,
>>>>>>>>>>> ex);
>>>>>>>>>>>     86         }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> I do not understand what is the need for nested try statements,
>>>>>>>>>>> just one
>>>>>>>>>>> try would be enough:
>>>>>>>>>>>
>>>>>>>>>>>     54         System.out.println("Starting LingeredApp");
>>>>>>>>>>>     55         try {
>>>>>>>>>>>     56             try {
>>>>>>>>>>>     . . .
>>>>>>>>>>>     81             } finally {
>>>>>>>>>>>     82                   theApp.stopApp();
>>>>>>>>>>>     83             }
>>>>>>>>>>>     84         } catch (IOException | InterruptedException ex) {
>>>>>>>>>>>     85                throw new RuntimeException("Test ERROR "
>>>>>>>>>>> + ex,
>>>>>>>>>>> ex);
>>>>>>>>>>>     86         }
>>>>>>>>>>>
>>>>>>>>>>>     98         try {
>>>>>>>>>>>     99             try {
>>>>>>>>>>>    . . .
>>>>>>>>>>>    116             } finally {
>>>>>>>>>>>    117                 theApp.stopApp();
>>>>>>>>>>>    118             }
>>>>>>>>>>>    119         } catch (Exception ex) {
>>>>>>>>>>>    120             throw new RuntimeException("Test ERROR " +
>>>>>>>>>>> ex, ex);
>>>>>>>>>>>    121         }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Why do you catch exceptions and throw the RuntimeException's in
>>>>>>>>>>> the
>>>>>>>>>>> launch() methods
>>>>>>>>>>> but catch the IOException in main? Would it be better to catch any
>>>>>>>>>>> Exception?
>>>>>>>>>>>
>>>>>>>>>>> Too many empty lines:
>>>>>>>>>>>
>>>>>>>>>>>     88
>>>>>>>>>>>     89
>>>>>>>>>>>     90
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> jdk_webrev/test/sun/tools/jhsdb/LingeredApp.java
>>>>>>>>>>>
>>>>>>>>>>> Too many empty lines:
>>>>>>>>>>>
>>>>>>>>>>>    275
>>>>>>>>>>>    276
>>>>>>>>>>>
>>>>>>>>>>>    369
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> jdk_webrev/test/sun/tools/jhsdb/SAGetoptTest.java
>>>>>>>>>>>
>>>>>>>>>>> Need to use Java naming convention:
>>>>>>>>>>>
>>>>>>>>>>>     36   private static boolean a_opt;
>>>>>>>>>>>     37   private static boolean b_opt;
>>>>>>>>>>>     38   private static boolean c_opt;
>>>>>>>>>>>     39   private static boolean e_opt;
>>>>>>>>>>>     40   private static boolean mixed_opt;
>>>>>>>>>>>     41
>>>>>>>>>>>     42   private static String  d_value;
>>>>>>>>>>>     43   private static String  exe_value;
>>>>>>>>>>>     44   private static String  core_value;
>>>>>>>>>>>
>>>>>>>>>>> Wrong indent 2 instead of 4:
>>>>>>>>>>>
>>>>>>>>>>>     70           if (s.equals("a")) {
>>>>>>>>>>>     71             a_opt = true;
>>>>>>>>>>>     72             continue;
>>>>>>>>>>>     73           }
>>>>>>>>>>>     74
>>>>>>>>>>>     75           if (s.equals("b")) {
>>>>>>>>>>>     76             b_opt = true;
>>>>>>>>>>>     77             continue;
>>>>>>>>>>>     78           }
>>>>>>>>>>>     79
>>>>>>>>>>>     80           if (s.equals("c")) {
>>>>>>>>>>>     81             c_opt = true;
>>>>>>>>>>>     82             continue;
>>>>>>>>>>>     83           }
>>>>>>>>>>>     84
>>>>>>>>>>>     85           if (s.equals("e")) {
>>>>>>>>>>>     86             e_opt = true;
>>>>>>>>>>>     87             continue;
>>>>>>>>>>>     88           }
>>>>>>>>>>>     89
>>>>>>>>>>>     90           if (s.equals("mixed")) {
>>>>>>>>>>>     91             mixed_opt = true;
>>>>>>>>>>>     92             continue;
>>>>>>>>>>>     93           }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Serguei
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 6/23/15 7:06 AM, Dmitry Samersoff wrote:
>>>>>>>>>>>> Hi Everybody,
>>>>>>>>>>>>
>>>>>>>>>>>> Please review the changes:
>>>>>>>>>>>>
>>>>>>>>>>>> http://cr.openjdk.java.net/~dsamersoff/JDK-8059038/webrev.04/
>>>>>>>>>>>>
>>>>>>>>>>>> I'm about to file CCC request for it but would like to get
>>>>>>>>>>>> internal
>>>>>>>>>>>> feedback before that.
>>>>>>>>>>>>
>>>>>>>>>>>> This fix is introducing native launcher jhsdb for serviceability
>>>>>>>>>>>> agent.
>>>>>>>>>>>>
>>>>>>>>>>>> jhsdb
>>>>>>>>>>>>
>>>>>>>>>>>> will launch command line debugger clhsdb
>>>>>>>>>>>>
>>>>>>>>>>>> jhsdb jstack file core
>>>>>>>>>>>> jhsdb jmap file core
>>>>>>>>>>>> jhsdb jinfo file core
>>>>>>>>>>>>
>>>>>>>>>>>> will launch corresponding SA based utility.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> -Dmitry
>>>>>>>>>>>>
>>>>>>>>>>>>
>>
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.
-------------- next part --------------
diff -ur webrevs_003/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java webrevs/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java
--- webrevs_003/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java	2015-07-17 16:01:36.000000000 +0300
+++ webrevs/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java	2015-07-17 17:56:00.000000000 +0300
@@ -101,7 +101,6 @@
         }
 
         String carg = _argv[_optind];
-        char ch = '-';
         _optarg = null;
 
         if (_optreset) {
@@ -133,12 +132,10 @@
             // At this point carg[0] contains '-'
             _optreset = false;
             _optopt = 1;
-            ch = carg.charAt(_optopt);
-        }
-        else {
-            ch = carg.charAt(_optopt);
         }
 
+        char ch = carg.charAt(_optopt);
+
         // adjust pointer to next character
         _optopt += 1;
 


More information about the serviceability-dev mailing list