diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 92cc6125f8..5c82858f64 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -1,27 +1,26 @@ package hudson; -import hudson.model.Hudson; -import hudson.model.TaskListener; -import hudson.model.Computer; -import hudson.remoting.VirtualChannel; -import hudson.remoting.Channel; -import hudson.remoting.RemoteOutputStream; -import hudson.remoting.RemoteInputStream; -import hudson.remoting.Pipe; -import hudson.remoting.Callable; import hudson.Proc.LocalProc; import hudson.Proc.RemoteProc; +import hudson.model.Computer; +import hudson.model.Hudson; +import hudson.model.TaskListener; +import hudson.remoting.Callable; +import hudson.remoting.Channel; +import hudson.remoting.Pipe; +import hudson.remoting.RemoteInputStream; +import hudson.remoting.RemoteOutputStream; +import hudson.remoting.VirtualChannel; +import hudson.util.ProcessTreeKiller; import hudson.util.StreamCopyThread; +import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.BufferedOutputStream; -import java.util.Map; import java.util.Arrays; - -import org.jvnet.winp.WinProcess; +import java.util.Map; /** * Starts a process. @@ -312,10 +311,7 @@ public abstract class Launcher { */ protected synchronized void terminate(IOException e) { super.terminate(e); - if(Hudson.isWindows()) - new WinProcess(proc).killRecursively(); - else - proc.destroy(); + ProcessTreeKiller.get().kill(proc); } 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 ade8c56323..e1b336c056 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -2,8 +2,8 @@ package hudson; import hudson.remoting.Channel; import hudson.util.IOException2; +import hudson.util.ProcessTreeKiller; import hudson.util.StreamCopyThread; -import hudson.model.Hudson; import java.io.File; import java.io.IOException; @@ -15,8 +15,6 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; -import org.jvnet.winp.WinProcess; - /** * External process wrapper. * @@ -162,10 +160,7 @@ public abstract class Proc { * Destroys the child process without join. */ private void destroy() { - if(Hudson.isWindows()) - new WinProcess(proc).killRecursively(); - else - proc.destroy(); + ProcessTreeKiller.get().kill(proc); } private static class ByteCopier extends Thread { diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index 5ba4799a5d..161d14f145 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -14,17 +14,33 @@ import hudson.remoting.VirtualChannel; import hudson.remoting.Which; import hudson.tasks.DynamicLabeler; import hudson.tasks.LabelFinder; -import hudson.util.*; +import hudson.util.ClockDifference; +import hudson.util.NullStream; +import hudson.util.ProcessTreeKiller; +import hudson.util.RingBufferLogHandler; +import hudson.util.StreamCopyThread; +import hudson.util.StreamTaskListener; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; -import org.jvnet.winp.WinProcess; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.Serializable; import java.net.URL; import java.net.URLConnection; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; @@ -322,10 +338,7 @@ public final class Slave implements Node, Serializable { public void onClosed(Channel channel, IOException cause) { if(cause!=null) cause.printStackTrace(listener.error(Messages.Slave_Terminated(getTimestamp()))); - if(Hudson.isWindows()) - new WinProcess(proc).killRecursively(); - else - proc.destroy(); + ProcessTreeKiller.get().kill(proc); } });