=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server.c,v retrieving revision 1.41 retrieving revision 1.42 diff -c -r1.41 -r1.42 *** src/usr.bin/tmux/server.c 2009/09/23 06:18:47 1.41 --- src/usr.bin/tmux/server.c 2009/09/23 08:21:57 1.42 *************** *** 1,4 **** ! /* $OpenBSD: server.c,v 1.41 2009/09/23 06:18:47 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: server.c,v 1.42 2009/09/23 08:21:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 49,54 **** --- 49,55 ---- 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,250 **** struct window *w; struct pollfd *pfds, *pfd; int nfds, xtimeout; ! u_int i, n; time_t now, last; siginit(); --- 245,251 ---- struct window *w; struct pollfd *pfds, *pfd; int nfds, xtimeout; ! u_int i; time_t now, last; siginit(); *************** *** 258,263 **** --- 259,268 ---- 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,358 **** /* 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); --- 342,347 ---- *************** *** 391,396 **** --- 380,395 ---- 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,418 **** 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); ! } } } /* Handle SIGCHLD. */ --- 402,424 ---- 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++) { ! if (ARRAY_ITEM(&clients, i) != NULL) ! return (0); } + return (1); } /* Handle SIGCHLD. */