From bda15d2acb42ab9be526207f3fb5bc5dd07b282f Mon Sep 17 00:00:00 2001 From: kohsuke Date: Fri, 8 Feb 2008 06:17:02 +0000 Subject: [PATCH] integrated winp so that Hudson can kill processes recursively on Windows. git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@7016 71c3de6d-444a-0410-be80-ed276b4c234a --- core/pom.xml | 5 +++++ core/src/main/java/hudson/Launcher.java | 7 ++++++- core/src/main/java/hudson/Proc.java | 17 +++++++++++++++-- core/src/main/java/hudson/model/Slave.java | 6 +++++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index f5d20f524e..e3662c71bc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -461,6 +461,11 @@ commons-collections 3.2 + + org.jvnet.winp + winp + 1.1 + com.octo.captcha jcaptcha-all diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index d74dec2f95..92cc6125f8 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -21,6 +21,8 @@ import java.io.BufferedOutputStream; import java.util.Map; import java.util.Arrays; +import org.jvnet.winp.WinProcess; + /** * Starts a process. * @@ -310,7 +312,10 @@ public abstract class Launcher { */ protected synchronized void terminate(IOException e) { super.terminate(e); - proc.destroy(); + if(Hudson.isWindows()) + new WinProcess(proc).killRecursively(); + else + proc.destroy(); } public synchronized void close() throws IOException { diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index 3fc4a153ee..ade8c56323 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -3,6 +3,7 @@ package hudson; import hudson.remoting.Channel; import hudson.util.IOException2; import hudson.util.StreamCopyThread; +import hudson.model.Hudson; import java.io.File; import java.io.IOException; @@ -14,6 +15,8 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; +import org.jvnet.winp.WinProcess; + /** * External process wrapper. * @@ -144,17 +147,27 @@ public abstract class Proc { return r; } catch (InterruptedException e) { // aborting. kill the process - proc.destroy(); + destroy(); throw e; } } @Override public void kill() throws InterruptedException, IOException { - proc.destroy(); + destroy(); join(); } + /** + * Destroys the child process without join. + */ + private void destroy() { + if(Hudson.isWindows()) + new WinProcess(proc).killRecursively(); + else + proc.destroy(); + } + private static class ByteCopier extends Thread { private final InputStream in; private final OutputStream out; diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index 5c4a9ccc34..c6850eb3ba 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -17,6 +17,7 @@ import hudson.tasks.LabelFinder; import hudson.util.*; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.jvnet.winp.WinProcess; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; @@ -315,7 +316,10 @@ public final class Slave implements Node, Serializable { public void onClosed(Channel channel, IOException cause) { if(cause!=null) cause.printStackTrace(listener.error("%s slave agent was terminated\n",getTimestamp())); - proc.destroy(); + if(Hudson.isWindows()) + new WinProcess(proc).killRecursively(); + else + proc.destroy(); } });