// 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);
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 ),
/// 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;
}
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 )
/// 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