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