added signal handler for shutdown: SIGINT, SIGTERM
authorTimo Lotterbach <timo.lotterbach@bmw-carit.de>
Fri, 2 Dec 2011 09:19:09 +0000 (10:19 +0100)
committerMichael Schuldt <michael.schuldt@bmw-carit.de>
Mon, 5 Dec 2011 07:35:17 +0000 (08:35 +0100)
LayerManagerService/src/main.cpp

index cd0293e..cc576cd 100644 (file)
@@ -31,6 +31,7 @@
 #include "Log.h"
 #include <getopt.h>
 #include <libgen.h> // basename
+#include <signal.h>
 
 #include <list>
 using std::list;
@@ -69,6 +70,8 @@ const char* USAGE_DESCRIPTION = "Usage:\t LayerManagerService [options]\n"
                                 "\t-v: show version info\t\n"
                                 "\nexample: LayerManagerService -w800 -h480 -d:0\n";
 
+bool g_LayerManagerRunning;
+
 template<class T>
 T* getCreateFunction(string libname)
 {
@@ -339,6 +342,25 @@ void loadRendererPlugins(RendererList& rendererList, IScene* pScene)
     }
 }
 
+void signalHandler(int sig)
+{
+    switch (sig)
+    {
+    case SIGTERM:
+        g_LayerManagerRunning = false;
+        LOG_INFO("LayerManagerService", "Signal SIGTERM received. Shutting down.");
+        break;
+
+    case SIGINT:
+        g_LayerManagerRunning = false;
+        LOG_INFO("LayerManagerService", "Signal SIGINT received. Shutting down.");
+        break;
+
+    default:
+        LOG_INFO("LayerManagerService", "Signal " << sig << " received.");
+    }
+}
+
 int main(int argc, char **argv)
 {
     parseCommandLine(argc, (char**) argv);
@@ -403,7 +425,13 @@ int main(int argc, char **argv)
 
     // must stay within main method or else application would completely exit
     LOG_INFO("LayerManagerService", "Startup complete. EnterMainloop");
-    while (true)
+
+    // setup signal handler and global flag to handle shutdown
+    g_LayerManagerRunning = true;
+    signal(SIGTERM, signalHandler);
+    signal(SIGINT, signalHandler);
+
+    while (g_LayerManagerRunning)
     {
         CommunicatorListIterator commIter = communicatorList.begin();
         CommunicatorListIterator commIterEnd = communicatorList.end();
@@ -417,6 +445,10 @@ int main(int argc, char **argv)
     // cleanup
     cleanup:
 
+    // reset signal handling to default
+    signal(SIGTERM, SIG_DFL);
+    signal(SIGINT, SIG_DFL);
+
     LOG_INFO("LayerManagerService", "Exiting Application.");
     pManager->stopManagement();
     //delete pRenderer; TODO