From 0de513742ae180a370c7836aa285cc82a8e95f22 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 11 Sep 2010 19:26:28 +0200 Subject: [PATCH] Added a way to properly shut down the SCGI server. --- src/dolda/jsvc/scgi/DirServer.java | 11 +++++++++++ src/dolda/jsvc/scgi/Server.java | 29 +++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/dolda/jsvc/scgi/DirServer.java b/src/dolda/jsvc/scgi/DirServer.java index 8f19d8a..d238504 100644 --- a/src/dolda/jsvc/scgi/DirServer.java +++ b/src/dolda/jsvc/scgi/DirServer.java @@ -51,6 +51,17 @@ public class DirServer extends Server { RequestThread w = ctx.tg.respond(req); w.start(); } + + protected void shutdown() { + synchronized(contexts) { + for(Iterator> i = contexts.entrySet().iterator(); i.hasNext();) { + Map.Entry e = i.next(); + DSContext ctx = e.getValue(); + i.remove(); + ctx.tg.shutdown(); + } + } + } private static void usage(PrintStream out) { out.println("usage: dolda.jsvc.scgi.DirServer [-h] [-e CHARSET] [-d DATADIR] PORT"); diff --git a/src/dolda/jsvc/scgi/Server.java b/src/dolda/jsvc/scgi/Server.java index f01eae9..f8d4637 100644 --- a/src/dolda/jsvc/scgi/Server.java +++ b/src/dolda/jsvc/scgi/Server.java @@ -8,6 +8,7 @@ import java.util.*; public abstract class Server implements Runnable { private final ServerSocket sk; private final Logger logger = Logger.getLogger("dolda.jsvc.scgi"); + private boolean running = false; public String headcs = "UTF-8"; public Server(ServerSocket sk) { @@ -97,7 +98,12 @@ public abstract class Server implements Runnable { public void run() { try { try { - while(true) { + synchronized(this) { + if(running) + throw(new IllegalStateException("SCGI server is already running")); + running = true; + } + while(running) { Socket nsk = sk.accept(); serve(nsk); } @@ -105,7 +111,26 @@ public abstract class Server implements Runnable { sk.close(); } } catch(IOException e) { - logger.log(Level.SEVERE, "SCGI server encountered I/O error", e); + if((e instanceof SocketException) && !running) { + /* Assume that stop() has closed the socket. */ + } else { + logger.log(Level.SEVERE, "SCGI server encountered I/O error", e); + } + } finally { + shutdown(); + running = false; } } + + public void stop() { + try { + running = false; + sk.close(); + } catch(IOException e) { + throw(new RuntimeException(e)); + } + } + + protected void shutdown() { + } } -- 2.11.0