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();