From b4ab1a0cd992cf9e966b8edb9796d1eae53db744 Mon Sep 17 00:00:00 2001 From: James Peach Date: Thu, 14 Jun 2007 18:48:51 +0000 Subject: [PATCH] r23502: Restore exit-on-idle. Small refactoring for clarity. Exit if we are idle and we timed out waiting for something to do. --- source/smbd/server.c | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/source/smbd/server.c b/source/smbd/server.c index 98b9fb86263..532de36bf8b 100644 --- a/source/smbd/server.c +++ b/source/smbd/server.c @@ -315,6 +315,16 @@ static BOOL allowable_number_of_smbd_processes(void) return num_children < max_processes; } +/**************************************************************************** + Are we idle enough that we could safely exit? +****************************************************************************/ + +static BOOL smbd_is_idle(void) +{ + /* Currently we define "idle" as having no client connections. */ + return count_all_current_connections() == 0; +} + /**************************************************************************** Open the socket communication. ****************************************************************************/ @@ -414,10 +424,22 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_ &r_fds, &w_fds, &idle_timeout, &maxfd); - num = sys_select(maxfd+1,&r_fds,&w_fds,NULL, - timeval_is_zero(&idle_timeout) ? - NULL : &idle_timeout); - + if (timeval_is_zero(&idle_timeout)) { + num = sys_select(maxfd + 1, &r_fds, &w_fds, + NULL, NULL); + } else { + num = sys_select(maxfd + 1, &r_fds, &w_fds, + NULL, &idle_timeout); + + /* If the idle timeout fired and we are idle, exit + * gracefully. We expect to be running under a process + * controller that will restart us if necessry. + */ + if (num == 0 && smbd_is_idle()) { + exit_server_cleanly("idle timeout"); + } + } + if (num == -1 && errno == EINTR) { if (got_sig_term) { exit_server_cleanly(NULL); @@ -438,19 +460,6 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_ continue; } -#if 0 - Deactivated for now, this needs to become a timed event - vl - - /* If the idle timeout fired and we don't have any connected - * users, exit gracefully. We should be running under a process - * controller that will restart us if necessry. - */ - if (num == 0 && count_all_current_connections() == 0) { - exit_server_cleanly("idle timeout"); - } -#endif - /* check if we need to reload services */ check_reload(time(NULL)); -- 2.34.1