diff options
author | 2016-06-28 13:45:18 +0000 | |
---|---|---|
committer | 2016-06-29 08:53:20 +0000 | |
commit | 2b4e2e41d711655d93990fb7b5ae4386cd854cd8 (patch) | |
tree | 405142201f433f0ada614478a768acaae76fd0b1 /src/main/java/com/google/devtools/build/lib | |
parent | 1673a7a1db1f72f9523e459f56097d57dec8b1eb (diff) |
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
5 files changed, 47 insertions, 50 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index ab08d72355..7f0f3991aa 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 @@ java_library( ":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 37df646e1e..972bfa8004 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 @@ class Consumers { /** * 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 @@ class Consumers { * 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 @@ class Consumers { /** * 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 e633b4fd57..16d75b074a 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 @@ public final class OsUtils { } 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 acbdb8cccb..c6a475844a 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 @@ public final class ProcessUtils { * @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 f23508da0b..f6d62602b3 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 @@ package com.google.devtools.build.lib.windows; * 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; + } } |