mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-17 10:35:10 +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:
parent
4cb9ab8ab7
commit
7d7e9b6fd8
49
src/conky.cc
49
src/conky.cc
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user