X-Git-Url: http://dolda2000.com/gitweb/?p=jsvc.git;a=blobdiff_plain;f=src%2Fdolda%2Fjsvc%2Fscgi%2FDirServer.java;h=1ac452c8139bfcc010ccebc368ca4d65d5c0e897;hp=d238504afe1b8bdca26e56138b975ad5de891ab3;hb=48d0e295cb79948858eb5aa99cc08cdf9f9e4546;hpb=0de513742ae180a370c7836aa285cc82a8e95f22 diff --git a/src/dolda/jsvc/scgi/DirServer.java b/src/dolda/jsvc/scgi/DirServer.java index d238504..1ac452c 100644 --- a/src/dolda/jsvc/scgi/DirServer.java +++ b/src/dolda/jsvc/scgi/DirServer.java @@ -12,6 +12,7 @@ public class DirServer extends Server { private final Map contexts = new HashMap(); private final Environment env; private final Logger logger = Logger.getLogger("dolda.jsvc.scgi.dirserver"); + private Thread sdhook = null, main = null; public DirServer(ServerSocket sk, Environment env) { super(sk); @@ -52,7 +53,21 @@ public class DirServer extends Server { w.start(); } + private class ShutdownHandler extends Thread { + public void run() { + sdhook = null; + DirServer.this.stop(); + try { + main.join(); + } catch(InterruptedException e) {} + } + } + protected void shutdown() { + try { + if(sdhook != null) + Runtime.getRuntime().removeShutdownHook(sdhook); + } catch(Exception e) {} synchronized(contexts) { for(Iterator> i = contexts.entrySet().iterator(); i.hasNext();) { Map.Entry e = i.next(); @@ -61,6 +76,7 @@ public class DirServer extends Server { ctx.tg.shutdown(); } } + super.shutdown(); } private static void usage(PrintStream out) { @@ -111,6 +127,8 @@ public class DirServer extends Server { if(charset != null) s.headcs = charset; - new Thread(s, "SCGI server thread").start(); + Runtime.getRuntime().addShutdownHook(s.sdhook = s.new ShutdownHandler()); + s.main = new Thread(s, "SCGI server thread"); + s.main.start(); } }