Merge "Proposed minimal DiagnosticsHandler API."
diff --git a/src/main/java/com/android/tools/r8/utils/ThreadUtils.java b/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
index 0eaf1ad..a2bfeda 100644
--- a/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
@@ -35,14 +35,12 @@
}
public static ExecutorService getExecutorService(InternalOptions options) {
- if (options.numberOfThreads == options.NOT_SPECIFIED) {
+ int threads = options.numberOfThreads;
+ if (threads == options.NOT_SPECIFIED) {
// This heuristic is based on measurements on a 32 core (hyper-threaded) machine.
- int threads = Integer.min(Runtime.getRuntime().availableProcessors(), 16) / 2;
- return Executors.newWorkStealingPool(threads);
- } else if (options.numberOfThreads == 1) {
- return Executors.newSingleThreadExecutor();
- } else {
- return Executors.newWorkStealingPool(options.numberOfThreads);
+ threads = Integer.min(Runtime.getRuntime().availableProcessors(), 16) / 2;
}
+ // Don't use Executors.newSingleThreadExecutor() when threads == 1, see b/67338394.
+ return Executors.newWorkStealingPool(threads);
}
}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index f5fe0f9..377d2aa 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -32,6 +32,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -819,6 +820,23 @@
}
}
+ // Process.pid() is added in Java 9. Until we use Java 9 this can be used on Linux and Mac OS.
+ // https://docs.oracle.com/javase/9/docs/api/java/lang/Process.html#pid--
+ private static synchronized long getPidOfProcess(Process p) {
+ long pid = -1;
+ try {
+ if (p.getClass().getName().equals("java.lang.UNIXProcess")) {
+ Field f = p.getClass().getDeclaredField("pid");
+ f.setAccessible(true);
+ pid = f.getLong(p);
+ f.setAccessible(false);
+ }
+ } catch (Exception e) {
+ pid = -1;
+ }
+ return pid;
+ }
+
public static ProcessResult runProcess(ProcessBuilder builder) throws IOException {
System.out.println(String.join(" ", builder.command()));
Process p = builder.start();