summaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2020-11-01 15:32:39 +0100
committerPřemysl Eric Janouch <p@janouch.name>2020-11-01 15:33:16 +0100
commitd05c85833d09e9b7da6c264c2ae66b30d0d6c882 (patch)
tree090151a2154a8abfe279018245f0c184cb975f72 /degesch.c
parent2336340ad85be662d7b23118fd7c6d216413c757 (diff)
downloadxK-d05c85833d09e9b7da6c264c2ae66b30d0d6c882.tar.gz
xK-d05c85833d09e9b7da6c264c2ae66b30d0d6c882.tar.xz
xK-d05c85833d09e9b7da6c264c2ae66b30d0d6c882.zip
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.
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c25
1 files 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);
}
}