From 18ea820cb0f1e7d9936c89abf15130e40efc956b Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 23 Sep 2009 08:21:57 +0000 Subject: [PATCH] On SIGTERM, just abandon any suspended/locked clients and leave them to it, otherwise the server will hang around (refusing new connections) until they exit properly. --- server.c | 56 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/server.c b/server.c index e465ace0..6dac5f5b 100644 --- a/server.c +++ b/server.c @@ -49,6 +49,7 @@ void server_create_client(int); int server_create_socket(void); int server_main(int); void server_shutdown(void); +int server_should_shutdown(void); void server_child_signal(void); void server_fill_windows(struct pollfd **); void server_handle_windows(struct pollfd **); @@ -244,7 +245,7 @@ server_main(int srv_fd) struct window *w; struct pollfd *pfds, *pfd; int nfds, xtimeout; - u_int i, n; + u_int i; time_t now, last; siginit(); @@ -258,6 +259,10 @@ server_main(int srv_fd) if (sigterm) server_shutdown(); + /* Stop if no sessions or clients left. */ + if (server_should_shutdown()) + break; + /* Handle child exit. */ if (sigchld) { server_child_signal(); @@ -337,22 +342,6 @@ server_main(int srv_fd) /* Collect dead clients and sessions. */ server_clean_dead(); - - /* - * If we have no sessions and clients left, let's get out - * of here... - */ - n = 0; - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if (ARRAY_ITEM(&sessions, i) != NULL) - n++; - } - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - if (ARRAY_ITEM(&clients, i) != NULL) - n++; - } - if (n == 0) - break; } if (pfds != NULL) xfree(pfds); @@ -391,6 +380,16 @@ server_shutdown(void) struct client *c; u_int i, j; + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c != NULL) { + if (c->flags & (CLIENT_BAD|CLIENT_SUSPENDED)) + server_lost_client(c); + else + server_write_client(c, MSG_SHUTDOWN, NULL, 0); + } + } + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { s = ARRAY_ITEM(&sessions, i); for (j = 0; j < ARRAY_LENGTH(&clients); j++) { @@ -403,16 +402,23 @@ server_shutdown(void) if (s != NULL) session_destroy(s); } +} - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c != NULL) { - if (c->flags & CLIENT_BAD) - server_lost_client(c); - else - server_write_client(c, MSG_SHUTDOWN, NULL, 0); - } +/* Check if the server should be shutting down (no more clients or windows). */ +int +server_should_shutdown(void) +{ + u_int i; + + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + if (ARRAY_ITEM(&sessions, i) != NULL) + return (0); } + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + if (ARRAY_ITEM(&clients, i) != NULL) + return (0); + } + return (1); } /* Handle SIGCHLD. */