Make "bazel info server_pid" work on Windows. This is the first actual use of Windows JNI! Also a cleanup of ProcessUtils. Injecting a mock implementation was never used. -- MOS_MIGRATED_REVID=126068832
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index ab08d72..7f0f399 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -256,6 +256,7 @@ ":shell", ":unix", ":vfs", + ":windows", "//src/main/java/com/google/devtools/common/options", "//third_party:guava", "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/shell/Consumers.java b/src/main/java/com/google/devtools/build/lib/shell/Consumers.java index 37df646..972bfa8 100644 --- a/src/main/java/com/google/devtools/build/lib/shell/Consumers.java +++ b/src/main/java/com/google/devtools/build/lib/shell/Consumers.java
@@ -129,8 +129,7 @@ /** * This consumer sends the input to a stream while consuming it. */ - private static class StreamingConsumer extends FutureConsumption - implements OutputConsumer { + private static class StreamingConsumer extends FutureConsumption { private OutputStream out; StreamingConsumer(OutputStream out) { @@ -158,8 +157,7 @@ * while consuming it. This accumulated stream can be obtained by * calling {@link #getAccumulatedOut()}. */ - private static class AccumulatingConsumer extends FutureConsumption - implements OutputConsumer { + private static class AccumulatingConsumer extends FutureConsumption { private ByteArrayOutputStream out = new ByteArrayOutputStream(); @Override @@ -180,8 +178,7 @@ /** * This consumer just discards whatever it reads. */ - private static class DiscardingConsumer extends FutureConsumption - implements OutputConsumer { + private static class DiscardingConsumer extends FutureConsumption { private DiscardingConsumer() { }
diff --git a/src/main/java/com/google/devtools/build/lib/util/OsUtils.java b/src/main/java/com/google/devtools/build/lib/util/OsUtils.java index e633b4f..16d75b0 100644 --- a/src/main/java/com/google/devtools/build/lib/util/OsUtils.java +++ b/src/main/java/com/google/devtools/build/lib/util/OsUtils.java
@@ -45,11 +45,15 @@ } private static boolean jniLibsAvailable() { + if (OS.getCurrent() == OS.WINDOWS) { + return true; + } + if ("0".equals(System.getProperty("io.bazel.UnixFileSystem"))) { return false; } - // JNI libraries work fine on Windows, but at the moment we are not using any. - return OS.getCurrent() != OS.WINDOWS; + + return true; } // Force JNI linking at a moment when we have 'installBase' handy, and print
diff --git a/src/main/java/com/google/devtools/build/lib/util/ProcessUtils.java b/src/main/java/com/google/devtools/build/lib/util/ProcessUtils.java index acbdb8c..c6a4758 100644 --- a/src/main/java/com/google/devtools/build/lib/util/ProcessUtils.java +++ b/src/main/java/com/google/devtools/build/lib/util/ProcessUtils.java
@@ -15,50 +15,13 @@ package com.google.devtools.build.lib.util; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.windows.WindowsProcesses; /** * OS Process related utilities. - * - * <p>Default implementation forwards all requests to - * {@link com.google.devtools.build.lib.unix.ProcessUtils}. The default implementation - * can be overridden by {@code #setImplementation(ProcessUtilsImpl)} method. */ @ThreadSafe public final class ProcessUtils { - - /** - * Describes implementation to which all {@code ProcessUtils} requests are - * forwarded. - */ - public interface ProcessUtilsImpl { - /** @see ProcessUtils#getgid() */ - int getgid(); - - /** @see ProcessUtils#getpid() */ - int getpid(); - - /** @see ProcessUtils#getuid() */ - int getuid(); - } - - private volatile static ProcessUtilsImpl implementation = new ProcessUtilsImpl() { - - @Override - public int getgid() { - return com.google.devtools.build.lib.unix.ProcessUtils.getgid(); - } - - @Override - public int getpid() { - return com.google.devtools.build.lib.unix.ProcessUtils.getpid(); - } - - @Override - public int getuid() { - return com.google.devtools.build.lib.unix.ProcessUtils.getuid(); - } - }; - private ProcessUtils() { // prevent construction. } @@ -67,20 +30,32 @@ * @return the real group ID of the current process. */ public static int getgid() { - return implementation.getgid(); + if (OS.getCurrent() == OS.WINDOWS) { + throw new UnsupportedOperationException(); + } else { + return com.google.devtools.build.lib.unix.ProcessUtils.getgid(); + } } /** * @return the process ID of this process. */ public static int getpid() { - return implementation.getpid(); + if (OS.getCurrent() == OS.WINDOWS) { + return WindowsProcesses.getpid(); + } else { + return com.google.devtools.build.lib.unix.ProcessUtils.getpid(); + } } /** * @return the real user ID of the current process. */ public static int getuid() { - return implementation.getuid(); + if (OS.getCurrent() == OS.WINDOWS) { + throw new UnsupportedOperationException(); + } else { + return com.google.devtools.build.lib.unix.ProcessUtils.getuid(); + } } }
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsProcesses.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsProcesses.java index f23508d..f6d6260 100644 --- a/src/main/java/com/google/devtools/build/lib/windows/WindowsProcesses.java +++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsProcesses.java
@@ -18,5 +18,25 @@ * Process management on Windows. */ public class WindowsProcesses { - public static native String helloWorld(int arg, String fruit); + private static boolean jniLoaded = false; + private WindowsProcesses() { + // Prevent construction + } + + private static native String helloWorld(int arg, String fruit); + private static native int nativeGetpid(); + + public static int getpid() { + ensureJni(); + return nativeGetpid(); + } + + private static synchronized void ensureJni() { + if (jniLoaded) { + return; + } + + System.loadLibrary("windows_jni"); + jniLoaded = true; + } }