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

Dmitry Samersoff dmitry.samersoff at oracle.com
Fri Jul 17 09:46:52 UTC 2015


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 --------------
zombie:hs-rt#diff -ur webrevs_001/hotspot_webrev/raw_files webrevs/hotspot_webrev/raw_files
diff -ur webrevs_001/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_001/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java      2015-06-24 15:14:58.000000000 +0300
+++ webrevs/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java  2015-07-16 17:54:08.000000000 +0300
@@ -58,6 +58,7 @@
             throw new RuntimeException("Not enough arguments for '" + opt + "'");
         }
 
+        // _argv[_optind] can't be empty, so it's safe to expect at least one character
         if (_argv[_optind].charAt(0) == '-') {
             throw new RuntimeException("Argument is expected for '" + opt + "'");
         }
@@ -109,18 +110,21 @@
             // End of option batch like '-abc' reached, expect option to start from '-'
             carg = _argv[_optind];
 
+            // carg can't be empty so it's safe to expect at least one character
             if (carg.charAt(0) != '-' || carg.equals("--")) {
                 // Stop processing on -- or first non-option argument;
                 return null;
             }
 
-            if (carg.charAt(0) == '-' && carg.charAt(1) == '-') {
+            if (carg.startsWith("--")) {
                 // Handle long options, it can't be combined so it's simple
                 if (longOptStr == null || longOptStr.length == 0) {
-                    // No long options specified, stop options processing
+                    // No long options expected, stop options processing
                     return null;
                 }
                 ++ _optind;
+               
+                // at this point carg contains at least one character besides --
                 carg = carg.substring(2);
                 return processLongOptions(carg, longOptStr);
             }
@@ -133,9 +137,11 @@
             // At this point carg[0] contains '-'
             _optreset = false;
             _optopt = 1;
+            // Length of carg checked below
             ch = carg.charAt(_optopt);
         }
         else {
+            // Length of carg checked below
             ch = carg.charAt(_optopt);
         }
 
diff -ur webrevs_001/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SALauncher.java webrevs/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SALauncher.java
--- webrevs_001/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SALauncher.java    2015-06-24 15:15:01.000000000 +0300
+++ webrevs/hotspot_webrev/raw_files/new/agent/src/share/classes/sun/jvm/hotspot/SALauncher.java        2015-07-16 17:54:09.000000000 +0300
@@ -329,7 +329,7 @@
 
         String[] oldArgs = Arrays.copyOfRange(args, 1, args.length);
 
-        // Run SA
+        // Run SA interactive mode
         if (args[0].equals("clhsdb")) {
             runCLHSDB(oldArgs);
             return;
@@ -340,7 +340,7 @@
             return;
         }
 
-        // Run tmtools
+        // Run SA tmtools mode
         if (args[0].equals("jstack")) {
             runJSTACK(oldArgs);
             return;


More information about the serviceability-dev mailing list