amendment to last commit: only makes sense if use different flags per signal type
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 22 Jan 2015 14:27:57 +0000 (15:27 +0100)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 22 Jan 2015 14:27:57 +0000 (15:27 +0100)
src/main.cpp

index ad5b6cf..ce92e0a 100644 (file)
@@ -82,7 +82,10 @@ void reset_signal_handlers();
 // data required for signal handling (SIGINT, SIGTERM, ... )
 struct signal_data_struct
 {
-    sig_atomic_t signaled_flag;
+    bool signaled_flag_int;
+    bool signaled_flag_term;
+    bool signaled_flag_usr1;
+    bool signaled_flag_usr2;
     IoServiceItem io_service;
     void (*old_handler_int )(int);
     void (*old_handler_term)(int);
@@ -93,7 +96,10 @@ struct signal_data_struct
     int config_log_level;
 
     signal_data_struct():
-        signaled_flag( false ),
+        signaled_flag_int( false ),
+        signaled_flag_term( false ),
+        signaled_flag_usr1( false ),
+        signaled_flag_usr2( false ),
         io_service(),
         old_handler_int( 0 ),
         old_handler_term( 0 ),
@@ -310,19 +316,19 @@ signal_data_struct signal_data;
 /// registered as signal handler; just sets signal_data.signaled_flag
 void signal_handler_int(int param)
 {
-    signal_data.signaled_flag = param;   // SIGINT
+    signal_data.signaled_flag_int = true;
 }
 void signal_handler_term(int param)
 {
-    signal_data.signaled_flag = param;   // SIGTERM
+    signal_data.signaled_flag_term = true;
 }
 void signal_handler_usr1(int param)
 {
-    signal_data.signaled_flag = param;   // SIGUSR1
+    signal_data.signaled_flag_usr1 = true;
 }
 void signal_handler_usr2(int param)
 {
-    signal_data.signaled_flag = param;   // SIGUSR2
+    signal_data.signaled_flag_usr2 = true;
 }
 
 
@@ -345,37 +351,34 @@ void signal_checker( const boost::system::error_code &error )
             want_stop = true;
         }
     }
-    else if ( signal_data.signaled_flag )
-    {   // so there has been a signal --> check which one it was
-
-        // quickly copy and reset signal flag
-        sig_atomic_t signaled_flag = signal_data.signaled_flag;
-        signal_data.signaled_flag = 0;
-
-        if ( signaled_flag == SIGUSR1 )
+    else {
+        if ( signal_data.signaled_flag_int )
+        {
+            signal_data.signaled_flag_int = false;
+            GlobalLogger.notice() << "Received signal SIGINT --> will stop" << endl;
+            want_stop = true;
+        }
+        else if ( signal_data.signaled_flag_term )
+        {
+            signal_data.signaled_flag_term = false;
+            GlobalLogger.notice() << "Received signal SIGTERM --> will stop" << endl;
+            want_stop = true;
+        }
+        else if ( signal_data.signaled_flag_usr1 )
         {
+            signal_data.signaled_flag_usr1 = false;
             int new_log_level = I2n::Logger::get_log_level()+1;
             I2n::Logger::set_log_level( new_log_level );
             GlobalLogger.info() << "Received SIGUSR1 -- increased log level to "
                 << I2n::Logger::get_log_level_string();
         }
-        else if ( signaled_flag == SIGUSR2 )
+        else if ( signal_data.signaled_flag_usr2 )
         {
+            signal_data.signaled_flag_usr2 = false;
             I2n::Logger::set_log_level( signal_data.config_log_level );
             GlobalLogger.info() << "Received SIGUSR2 -- reset log level to normal ("
                 << I2n::Logger::get_log_level_string() << ")";
         }
-        else if ( ( signaled_flag == SIGTERM ) || ( signaled_flag == SIGINT ))
-        {
-            GlobalLogger.notice() << "Received signal SIGINT/SIGTERM --> will stop" << endl;
-            want_stop = true;
-        }
-        else
-        {
-            GlobalLogger.warning() << "Do not know how to deal with unexpected signal "
-                << signaled_flag << " --> will stop" << endl;
-            want_stop = true;
-        }
     }
 
     if ( want_stop )
@@ -394,7 +397,10 @@ void signal_checker( const boost::system::error_code &error )
 /// register own signal handlers; see reset_signal_handlers for undo
 void install_signal_handlers( const IoServiceItem io_service, const int config_log_level )
 {
-    signal_data.signaled_flag = 0;
+    signal_data.signaled_flag_int = false;
+    signal_data.signaled_flag_term = false;
+    signal_data.signaled_flag_usr1 = false;
+    signal_data.signaled_flag_usr2 = false;
     signal_data.config_log_level = config_log_level;
 
     // install own signal handlers