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.
This commit is contained in:
Přemysl Eric Janouch 2020-11-01 15:32:39 +01:00
parent 2336340ad8
commit d05c85833d
Signed by: p
GPG Key ID: A0420B94F92B9493

View File

@ -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)
{
if (!ctx->quitting)
{
log_global_status (ctx, "Shutting down");
ctx->quitting = true;
// Hide the user interface
// 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);
}
}