diff options
author | 2016-07-05 12:23:48 +0000 | |
---|---|---|
committer | 2016-07-06 09:41:22 +0000 | |
commit | 5a2655ae69c8c7640ac91aec7b7ed4c1be4195ea (patch) | |
tree | 3e8b37aeeaafdd46c870ca80a309940d34c213f0 /src/main/java/com/google/devtools/build/lib/shell | |
parent | 50681c1b6cca1856f5f7b401ee5c757f22aa2e54 (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')
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(); } |