aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-06-28 13:45:18 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-06-29 08:53:20 +0000
commit2b4e2e41d711655d93990fb7b5ae4386cd854cd8 (patch)
tree405142201f433f0ada614478a768acaae76fd0b1 /src/main/java/com/google/devtools/build/lib
parent1673a7a1db1f72f9523e459f56097d57dec8b1eb (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/shell/Consumers.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/OsUtils.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/ProcessUtils.java57
-rw-r--r--src/main/java/com/google/devtools/build/lib/windows/WindowsProcesses.java22
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;
+ }
}