From d05c85833d09e9b7da6c264c2ae66b30d0d6c882 Mon Sep 17 00:00:00 2001 From: Přemysl Eric Janouch
Date: Sun, 1 Nov 2020 15:32:39 +0100 Subject: degesch: make a second SIGINT force-quit Also fixed the possibility of eating a sequence of signals as we reset the indicators /after/ we took action, which creates a time window for races. --- degesch.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/degesch.c b/degesch.c index 049e9c8..690e46a 100644 --- a/degesch.c +++ b/degesch.c @@ -5021,14 +5021,17 @@ irc_initiate_disconnect (struct server *s, const char *reason) } static void -initiate_quit (struct app_context *ctx, const char *message) +request_quit (struct app_context *ctx, const char *message) { - log_global_status (ctx, "Shutting down"); + if (!ctx->quitting) + { + log_global_status (ctx, "Shutting down"); + ctx->quitting = true; - // Hide the user interface - CALL (ctx->input, hide); + // Disable the user interface + CALL (ctx->input, hide); + } - // Initiate a connection close struct str_map_iter iter = str_map_iter_make (&ctx->servers); struct server *s; while ((s = str_map_iter_next (&iter))) @@ -5042,7 +5045,6 @@ initiate_quit (struct app_context *ctx, const char *message) irc_destroy_connector (s); } - ctx->quitting = true; try_finish_quit (ctx); } @@ -11280,7 +11282,7 @@ handle_command_me (struct handler_args *a) static bool handle_command_quit (struct handler_args *a) { - initiate_quit (a->ctx, *a->arguments ? a->arguments : NULL); + request_quit (a->ctx, *a->arguments ? a->arguments : NULL); return true; } @@ -13722,12 +13724,15 @@ on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx) while (try_reap_child (ctx)) ; - if (g_termination_requested && !ctx->quitting) - initiate_quit (ctx, NULL); + if (g_termination_requested) + { + g_termination_requested = false; + request_quit (ctx, NULL); + } if (g_winch_received) { - redraw_screen (ctx); g_winch_received = false; + redraw_screen (ctx); } } -- cgit v1.2.3-70-g09d2