RFR: add ability to execute external command before/after forked JVM

Sergey Kuksenko sergey.kuksenko at oracle.com
Fri Jun 21 07:32:44 PDT 2013


Add ability to execute external command before/after forked JVM.
Two new options: -execBeforeJVM <cmdstring> and -execAfterJVM <cmdstring>.


----- patch starts here---------------------------
diff -r a4c4b0a76df4 
jmh-core/src/main/java/org/openjdk/jmh/runner/Runner.java
--- a/jmh-core/src/main/java/org/openjdk/jmh/runner/Runner.java	Fri Jun 
21 17:06:42 2013 +0400
+++ b/jmh-core/src/main/java/org/openjdk/jmh/runner/Runner.java	Fri Jun 
21 18:30:25 2013 +0400
@@ -373,6 +373,8 @@

          String[] commandString = 
options.getSeparateExecutionCommand(benchmark, annJvmArgs, 
annJvmArgsPrepend, annJvmArgsAppend, host, port);

+        String execBefore = options.getExecBeforeFork();
+        String execAfter = options.getExecAfterFork();
          int forkCount = decideForks(options.getForkCount(), 
benchForks(benchmark));
          int warmupForkCount = 
decideWarmupForks(options.getWarmupForkCount(), forkAnnotation);
          if (warmupForkCount > 0) {
@@ -383,7 +385,9 @@
                  outputHandler.verbosePrintln("Warmup forking " + 
warmupForkCount + " times using command: " + 
Arrays.toString(warmupForkCheat));
              }
              for (int i = 0; i < warmupForkCount; i++) {
+                exec(execBefore);
                  doFork(reader, warmupForkCheat);
+                exec(execAfter);
              }
          }
          if (forkCount == 1) {
@@ -392,7 +396,9 @@
              outputHandler.verbosePrintln("Forking " + forkCount + " 
times using command: " + Arrays.toString(commandString));
          }
          for (int i = 0; i < forkCount; i++) { // TODO should we report 
fork number somehow?
+            exec(execBefore);
              doFork(reader, commandString);
+            exec(execAfter);
          }
      }

@@ -437,6 +443,38 @@
          }
      }

+    private void exec(String commandString) {
+        if (commandString!=null) {
+            try {
+                Process p = Runtime.getRuntime().exec(commandString);
+
+                // drain streams, else we might lock up
+                InputStreamDrainer errDrainer = new 
InputStreamDrainer(p.getErrorStream(), System.err);
+                InputStreamDrainer outDrainer = new 
InputStreamDrainer(p.getInputStream(), System.out);
+
+                errDrainer.start();
+                outDrainer.start();
+
+                int ecode = p.waitFor();
+
+                errDrainer.join();
+                outDrainer.join();
+
+                if (ecode != 0) {
+                    outputHandler.println("WARNING: executed process 
(\""+commandString+"\") returned code: " + ecode);
+                    if (options.shouldFailOnError()) {
+                        throw new IllegalStateException("WARNING: 
executed process (\""+commandString+"\") returned code: " + ecode);
+                    }
+                }
+
+            } catch (IOException ex) {
+                outputHandler.exception(ex);
+            } catch (InterruptedException ex) {
+                outputHandler.exception(ex);
+            }
+        }
+    }
+
      /**
       * Run a micro benchmark in bulk warmup mode
       *
diff -r a4c4b0a76df4 
jmh-core/src/main/java/org/openjdk/jmh/runner/options/HarnessOptions.java
--- 
a/jmh-core/src/main/java/org/openjdk/jmh/runner/options/HarnessOptions.java 
Fri Jun 21 17:06:42 2013 +0400
+++ 
b/jmh-core/src/main/java/org/openjdk/jmh/runner/options/HarnessOptions.java 
Fri Jun 21 18:30:25 2013 +0400
@@ -105,6 +105,13 @@
      @Option(name = "--listprofilers", usage = "List available profilers")
      protected boolean listProfilers = false;

+    @Option(name = "--execBeforeFork", usage = "execute external 
command before each forked jvm")
+    protected String execBeforeFork = null;
+
+    @Option(name = "--execAfterFork", usage = "execute external command 
after each forked jvm")
+    protected String execAfterFork = null;
+
+
      /**
       * Warmup Mode enum
       */
@@ -305,6 +312,24 @@
       *
       * @return the value
       */
+    public String getExecBeforeFork() {
+        return execBeforeFork;
+    }
+
+    /**
+     * Getter
+     *
+     * @return the value
+     */
+    public String getExecAfterFork() {
+        return execAfterFork;
+    }
+
+    /**
+     * Getter
+     *
+     * @return the value
+     */
      public String getJvmArgs() {
          return jvmArgs;
      }


More information about the jmh-dev mailing list