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();
}
});