1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-09-29 21:49:07 +00:00

Fix race conditions in signal handling (#233)

SIGHUP, SIGUSR1, SIGKINT and SIGTERM are no longer lost to race
    conditions. In particular, a SIGHUP can no more cancel a SIGTERM.
This commit is contained in:
Guillaume Maudoux 2016-04-13 19:33:04 +02:00 committed by Brenden Matthews
parent 4cb9ab8ab7
commit 7d7e9b6fd8

View File

@ -192,7 +192,7 @@ int top_io;
#endif
int top_running;
static conky::simple_config_setting<bool> extra_newline("extra_newline", false, false);
static volatile int g_signal_pending;
static volatile sig_atomic_t g_sigterm_pending, g_sighup_pending;
/* Update interval */
conky::range_config_setting<double> update_interval("update_interval", 0.0,
@ -2415,14 +2415,14 @@ static void main_loop(void)
}
#endif
switch (g_signal_pending) {
case SIGHUP:
case SIGUSR1:
if (g_sighup_pending) {
g_sighup_pending = false;
NORM_ERR("received SIGHUP or SIGUSR1. reloading the config file.");
reload_config();
break;
case SIGINT:
case SIGTERM:
}
if (g_sigterm_pending) {
g_sigterm_pending = false;
NORM_ERR("received SIGINT or SIGTERM to terminate. bye!");
terminate = 1;
#ifdef BUILD_X11
@ -2436,17 +2436,6 @@ static void main_loop(void)
#endif /* BUILD_XDAMAGE */
}
#endif /* BUILD_X11 */
break;
default:
/* Reaching here means someone set a signal
* (SIGXXXX, signal_handler), but didn't write any code
* to deal with it.
* If you don't want to handle a signal, don't set a handler on
* it in the first place. */
if (g_signal_pending) {
NORM_ERR("ignoring signal (%d)", g_signal_pending);
}
break;
}
#ifdef HAVE_SYS_INOTIFY_H
if (!disable_auto_reload.get(*state) && inotify_fd != -1
@ -2500,7 +2489,6 @@ static void main_loop(void)
#endif /* HAVE_SYS_INOTIFY_H */
llua_update_info(&info, active_update_interval());
g_signal_pending = 0;
}
clean_up(NULL, NULL);
@ -3059,7 +3047,8 @@ int main(int argc, char **argv)
#endif
argc_copy = argc;
argv_copy = argv;
g_signal_pending = 0;
g_sigterm_pending = false;
g_sighup_pending = false;
#ifdef BUILD_CURL
struct curl_global_initializer {
@ -3178,5 +3167,23 @@ static void signal_handler(int sig)
* we will poll g_signal_pending with each loop of conky
* and do any signal processing there, NOT here */
g_signal_pending = sig;
switch (sig) {
case SIGINT:
case SIGTERM:
g_sigterm_pending = true;
break;
case SIGHUP:
case SIGUSR1:
g_sighup_pending = true;
break;
default:
/* Reaching here means someone set a signal
* (SIGXXXX, signal_handler), but didn't write any code
* to deal with it.
* If you don't want to handle a signal, don't set a handler on
* it in the first place.
* We cannot print debug messages from a sighandler, so simply ignore.
*/
break;
}
}