aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/shell
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-07-05 12:23:48 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-07-06 09:41:22 +0000
commit5a2655ae69c8c7640ac91aec7b7ed4c1be4195ea (patch)
tree3e8b37aeeaafdd46c870ca80a309940d34c213f0 /src/main/java/com/google/devtools/build/lib/shell
parent50681c1b6cca1856f5f7b401ee5c757f22aa2e54 (diff)
Make Windows process management nicer.
Subprocesses now get killed if the Bazel server itself is killed and so do their subprocesses. Also implemented Subprocess#close() so that we get a little more control over when the native structures are cleaned up. -- MOS_MIGRATED_REVID=126628000
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/shell')
-rw-r--r--src/main/java/com/google/devtools/build/lib/shell/Command.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/shell/JavaSubprocessFactory.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/shell/Subprocess.java10
3 files changed, 18 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/shell/Command.java b/src/main/java/com/google/devtools/build/lib/shell/Command.java
index 35d3b8720e..8d40c15e24 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/Command.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/Command.java
@@ -817,10 +817,11 @@ public final class Command {
log.finer("Waiting for process...");
- TerminationStatus status =
- waitForProcess(process, killSubprocessOnInterrupt);
-
+ TerminationStatus status = waitForProcess(process, killSubprocessOnInterrupt);
observer.stopObserving(processKillable);
+ // #close() must be called after the #stopObserving() so that a badly-timed timeout does not
+ // try to destroy a process that is already closed
+ process.close();
log.finer(status.toString());
diff --git a/src/main/java/com/google/devtools/build/lib/shell/JavaSubprocessFactory.java b/src/main/java/com/google/devtools/build/lib/shell/JavaSubprocessFactory.java
index ab3acd4e44..7c85cec5f9 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/JavaSubprocessFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/JavaSubprocessFactory.java
@@ -78,6 +78,11 @@ public class JavaSubprocessFactory implements Subprocess.Factory {
public InputStream getInputStream() {
return process.getInputStream();
}
+
+ @Override
+ public void close() {
+ // java.lang.Process doesn't give us a way to clean things up other than #destroy()
+ }
}
public static final JavaSubprocessFactory INSTANCE = new JavaSubprocessFactory();
diff --git a/src/main/java/com/google/devtools/build/lib/shell/Subprocess.java b/src/main/java/com/google/devtools/build/lib/shell/Subprocess.java
index f8a8a553e7..e5710e7e7c 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/Subprocess.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/Subprocess.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.shell;
+import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -21,7 +22,7 @@ import java.io.OutputStream;
/**
* A process started by Bazel.
*/
-public interface Subprocess {
+public interface Subprocess extends Closeable {
/**
* Something that can create subprocesses.
@@ -70,4 +71,11 @@ public interface Subprocess {
* Returns a stream from which the stderr of the process can be read.
*/
InputStream getErrorStream();
+
+ /*
+ * Terminates the process as thoroughly as the underlying implementation allows and releases
+ * native data structures associated with the process.
+ */
+ @Override
+ void close();
}