aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-07-04 12:57:25 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-07-04 14:02:50 +0000
commit74dcfee2daa23934178579b2e5987178c51c73e2 (patch)
tree0ca6abfcf43359103d0006ad0f61ac0a70e3f3dc
parentc4aeb0424f5882c7f3b6497a1e4c21c285d6fd0a (diff)
Use the subprocess factory that uses the Win32 API on Windows.
We should really do something about the mess that is loading our JNI libraries -- io.bazel.EnableJNI is mentioned eight times in the code in various diverse contexts. This change is not the right place to do it, though. -- MOS_MIGRATED_REVID=126570481
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java2
5 files changed, 37 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 567a65b2b0..f56f688d72 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -864,6 +864,7 @@ java_library(
":unix",
":util",
":vfs",
+ ":windows",
"//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/query2",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index f11b51a05f..f95aecd3e3 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -71,6 +71,9 @@ import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.In
import com.google.devtools.build.lib.server.AfUnixServer;
import com.google.devtools.build.lib.server.RPCServer;
import com.google.devtools.build.lib.server.signal.InterruptSignalHandler;
+import com.google.devtools.build.lib.shell.JavaSubprocessFactory;
+import com.google.devtools.build.lib.shell.Subprocess;
+import com.google.devtools.build.lib.shell.SubprocessBuilder;
import com.google.devtools.build.lib.skyframe.DiffAwareness;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutorFactory;
@@ -93,6 +96,7 @@ import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.UnixFileSystem;
import com.google.devtools.build.lib.vfs.WindowsFileSystem;
+import com.google.devtools.build.lib.windows.WindowsSubprocessFactory;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.common.options.Option;
@@ -893,6 +897,14 @@ public final class BlazeRuntime {
return OS.getCurrent() == OS.WINDOWS ? new WindowsFileSystem() : new UnixFileSystem();
}
+ private static Subprocess.Factory subprocessFactoryImplementation() {
+ if (!"0".equals(System.getProperty("io.bazel.EnableJni")) && OS.getCurrent() == OS.WINDOWS) {
+ return WindowsSubprocessFactory.INSTANCE;
+ } else {
+ return JavaSubprocessFactory.INSTANCE;
+ }
+ }
+
/**
* Creates and returns a new Blaze RPCServer. Call {@link RPCServer#serve()} to start the server.
*/
@@ -1028,7 +1040,9 @@ public final class BlazeRuntime {
if (fs == null) {
fs = fileSystemImplementation();
}
+
Path.setFileSystemForSerialization(fs);
+ SubprocessBuilder.setSubprocessFactory(subprocessFactoryImplementation());
Path installBasePath = fs.getPath(installBase);
Path outputBasePath = fs.getPath(outputBase);
diff --git a/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java b/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java
index 0b6ecfb2f5..b89cf9644b 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java
@@ -46,6 +46,12 @@ public class SubprocessBuilder {
private File stderrFile;
private File workingDirectory;
+ private static Subprocess.Factory factory = JavaSubprocessFactory.INSTANCE;
+
+ public static void setSubprocessFactory(Subprocess.Factory factory) {
+ SubprocessBuilder.factory = factory;
+ }
+
public SubprocessBuilder() {
stdoutAction = StreamAction.STREAM;
stderrAction = StreamAction.STREAM;
@@ -154,6 +160,6 @@ public class SubprocessBuilder {
}
public Subprocess start() throws IOException {
- return JavaSubprocessFactory.INSTANCE.create(this);
+ return factory.create(this);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java
index b95aa615ef..2fe564e678 100644
--- a/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java
@@ -18,11 +18,22 @@ package com.google.devtools.build.lib.windows;
* Loads native code under Windows.
*/
public class WindowsJniLoader {
- public static void loadJni() {
+ private static boolean jniLoaded = false;
+ public static synchronized void loadJni() {
+ if (jniLoaded) {
+ return;
+ }
+
System.loadLibrary("windows_jni");
+ jniLoaded = true;
}
- public static void loadJniForTesting(String jniDll) {
+ public static synchronized void loadJniForTesting(String jniDll) {
+ if (jniLoaded) {
+ return;
+ }
+
System.load(jniDll);
+ jniLoaded = true;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java
index 3a79477ddd..6e7f5290ea 100644
--- a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java
@@ -36,6 +36,8 @@ public class WindowsSubprocessFactory implements Subprocess.Factory {
@Override
public Subprocess create(SubprocessBuilder builder) throws IOException {
+ WindowsJniLoader.loadJni();
+
String commandLine = WindowsProcesses.quoteCommandLine(builder.getArgv());
byte[] env = builder.getEnv() == null ? null : convertEnvToNative(builder.getEnv());