mirror of
https://github.com/tmux/tmux.git
synced 2024-12-13 01:48:47 +00:00
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.
This commit is contained in:
parent
631a618238
commit
18ea820cb0
54
server.c
54
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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++) {
|
||||
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);
|
||||
}
|
||||
if (ARRAY_ITEM(&clients, i) != NULL)
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Handle SIGCHLD. */
|
||||
|
Loading…
Reference in New Issue
Block a user