diff options
Diffstat (limited to 'tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java')
-rw-r--r-- | tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java b/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java index c910311..4bb5187 100644 --- a/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java +++ b/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java @@ -34,9 +34,12 @@ this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ - package net.sourceforge.jnlp; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + /** * class which timeout any ThreadedProcess. This killing of 'thread with process' replaced not working process.destroy(). */ @@ -112,14 +115,10 @@ class ProcessAssasin extends Thread { ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + "null .. killing " + p.getCommandLine() + ": "); } wasTerminated = true; - p.interrupt(); - while (!ServerAccess.terminated.contains(p)) { - Thread.sleep(100); - } if (p.getP() != null) { try { if (!skipInstedOfDesroy) { - p.getP().destroy(); + destroyProcess(p); } } catch (Throwable ex) { if (p.deadlyException == null) { @@ -128,6 +127,10 @@ class ProcessAssasin extends Thread { ex.printStackTrace(); } } + p.interrupt(); +// while (!ServerAccess.terminated.contains(p)) { +// Thread.sleep(100); +// } if (p.getP() != null) { ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + p.getP().toString() + " .. killed " + p.getCommandLine()); } else { @@ -156,4 +159,25 @@ class ProcessAssasin extends Thread { ServerAccess.logNoReprint("assassin for non existing job termination " + wasTerminated); } } + + public static void destroyProcess(ThreadedProcess pp) { + Process p = pp.getP(); + try { + Field f = p.getClass().getDeclaredField("pid"); + f.setAccessible(true); + String pid = (f.get(p)).toString(); + List<String> ll=new ArrayList<String>(4); + ll.add("kill"); + ll.add("-s"); + ll.add("SIGTERM"); + ll.add(pid); + ServerAccess.executeProcess(ll);//sync, but acctually release + //before affected application close + Thread.sleep(1000); + } catch (Exception ex) { + ServerAccess.logException(ex); + } finally { + p.destroy(); + } + } } |