diff --git a/src/java/com/threerings/presents/server/AbstractSignalHandler.java b/src/java/com/threerings/presents/server/AbstractSignalHandler.java index de0cdd72b..a8bb227fe 100644 --- a/src/java/com/threerings/presents/server/AbstractSignalHandler.java +++ b/src/java/com/threerings/presents/server/AbstractSignalHandler.java @@ -42,6 +42,15 @@ public abstract class AbstractSignalHandler */ protected abstract boolean registerHandlers (); + /** + * Implementations should call this method when a SIGTERM is received. + */ + protected void termReceived () + { + log.info("Shutdown initiated by TERM signal."); + _server.queueShutdown(); + } + /** * Implementations should call this method when a SIGINT is received. */ diff --git a/src/java/com/threerings/presents/server/NativeSignalHandler.java b/src/java/com/threerings/presents/server/NativeSignalHandler.java index 173d84181..780ad24c1 100644 --- a/src/java/com/threerings/presents/server/NativeSignalHandler.java +++ b/src/java/com/threerings/presents/server/NativeSignalHandler.java @@ -35,6 +35,9 @@ public class NativeSignalHandler extends AbstractSignalHandler public boolean signalReceived (int signo) { switch (signo) { + case SignalManager.SIGTERM: + termReceived(); + break; case SignalManager.SIGINT: intReceived(); break; @@ -53,6 +56,7 @@ public class NativeSignalHandler extends AbstractSignalHandler if (!SignalManager.servicesAvailable()) { return false; } + SignalManager.registerSignalHandler(SignalManager.SIGTERM, this); SignalManager.registerSignalHandler(SignalManager.SIGINT, this); SignalManager.registerSignalHandler(SignalManager.SIGHUP, this); return true; diff --git a/src/java/com/threerings/presents/server/PresentsServer.java b/src/java/com/threerings/presents/server/PresentsServer.java index 439cb6dbe..97773ac61 100644 --- a/src/java/com/threerings/presents/server/PresentsServer.java +++ b/src/java/com/threerings/presents/server/PresentsServer.java @@ -148,7 +148,7 @@ public class PresentsServer log.info("Starting up server [os=" + si.osToString() + ", jvm=" + si.jvmToString() + ", mem=" + si.memoryToString() + "]."); - // register SIGINT (ctrl-c) and a SIGHUP handlers + // register SIGTERM, SIGINT (ctrl-c) and a SIGHUP handlers boolean registered = false; try { registered = new SunSignalHandler().init(this); diff --git a/src/java/com/threerings/presents/server/SunSignalHandler.java b/src/java/com/threerings/presents/server/SunSignalHandler.java index 68af06296..8f9c2a5f0 100644 --- a/src/java/com/threerings/presents/server/SunSignalHandler.java +++ b/src/java/com/threerings/presents/server/SunSignalHandler.java @@ -33,6 +33,11 @@ public class SunSignalHandler extends AbstractSignalHandler { protected boolean registerHandlers () { + SignalUtil.register(SignalUtil.Number.TERM, new SignalUtil.Handler() { + public void signalReceived (SignalUtil.Number sig) { + termReceived(); + } + }); SignalUtil.register(SignalUtil.Number.INT, new SignalUtil.Handler() { public void signalReceived (SignalUtil.Number sig) { intReceived();