From fe0b56ead166377d415b0eaf04ee1af3bdb435de Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 18 Mar 2007 13:19:40 +0000 Subject: r21871: Move deadtime processing into an idle event. While there, simplify conn_idle_all() a bit. Volker (This used to be commit 3fc00977a99932b226bdcbc43bbc0ede1bcec26f) --- source3/smbd/conn.c | 27 ++++++++++++++++----------- source3/smbd/process.c | 21 --------------------- source3/smbd/server.c | 40 +++++++++++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 43 deletions(-) diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index 2d4020af39..388cd004f9 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -191,14 +191,14 @@ BOOL conn_idle_all(time_t t) { int deadtime = lp_deadtime()*60; pipes_struct *plist = NULL; - BOOL allidle = True; - connection_struct *conn, *next; + connection_struct *conn; if (deadtime <= 0) deadtime = DEFAULT_SMBD_TIMEOUT; - for (conn=Connections;conn;conn=next) { - next=conn->next; + for (conn=Connections;conn;conn=conn->next) { + + time_t age = t - conn->lastused; /* Update if connection wasn't idle. */ if (conn->lastused != conn->lastused_count) { @@ -207,12 +207,12 @@ BOOL conn_idle_all(time_t t) } /* close dirptrs on connections that are idle */ - if ((t-conn->lastused) > DPTR_IDLE_TIMEOUT) { + if (age > DPTR_IDLE_TIMEOUT) { dptr_idlecnum(conn); } - if (conn->num_files_open > 0 || (t-conn->lastused)num_files_open > 0 || age < deadtime) { + return False; } } @@ -221,11 +221,14 @@ BOOL conn_idle_all(time_t t) * idle with a handle open. */ - for (plist = get_first_internal_pipe(); plist; plist = get_next_internal_pipe(plist)) - if (plist->pipe_handles && plist->pipe_handles->count) - allidle = False; + for (plist = get_first_internal_pipe(); plist; + plist = get_next_internal_pipe(plist)) { + if (plist->pipe_handles && plist->pipe_handles->count) { + return False; + } + } - return allidle; + return True; } /**************************************************************************** @@ -303,6 +306,8 @@ void conn_free(connection_struct *conn) DLIST_REMOVE(Connections, conn); bitmap_clear(bmap, conn->cnum); + + SMB_ASSERT(num_open > 0); num_open--; conn_free_internal(conn); diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 76af8f2054..6497dfa97b 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -1328,9 +1328,7 @@ void check_reload(time_t t) static BOOL timeout_processing(int *select_timeout, time_t *last_timeout_processing_time) { - static time_t last_idle_closed_check = 0; time_t t; - BOOL allidle = True; if (smb_read_error == READ_EOF) { DEBUG(3,("timeout_processing: End of file from client (client has disconnected).\n")); @@ -1350,31 +1348,12 @@ static BOOL timeout_processing(int *select_timeout, *last_timeout_processing_time = t = time(NULL); - if(last_idle_closed_check == 0) - last_idle_closed_check = t; - /* become root again if waiting */ change_to_root_user(); /* check if we need to reload services */ check_reload(t); - /* automatic timeout if all connections are closed */ - if (conn_num_open()==0 && (t - last_idle_closed_check) >= IDLE_CLOSED_TIMEOUT) { - DEBUG( 2, ( "Closing idle connection\n" ) ); - return False; - } else { - last_idle_closed_check = t; - } - - /* check for connection timeouts */ - allidle = conn_idle_all(t); - - if (allidle && conn_num_open()>0) { - DEBUG(2,("Closing idle connection 2.\n")); - return False; - } - if(global_machine_password_needs_changing && /* for ADS we need to do a regular ADS password change, not a domain password change */ diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 0d4953e5b8..3f4313ce7f 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -826,6 +826,22 @@ static BOOL keepalive_fn(const struct timeval *now, void *private_data) return True; } +/* + * Do the recurring check if we're idle + */ +static BOOL deadtime_fn(const struct timeval *now, void *private_data) +{ + if ((conn_num_open() == 0) + || (conn_idle_all(now->tv_sec))) { + DEBUG( 2, ( "Closing idle connection\n" ) ); + message_send_pid(procid_self(), MSG_SHUTDOWN, NULL, 0, False); + return False; + } + + return True; +} + + /**************************************************************************** main program. ****************************************************************************/ @@ -1119,18 +1135,20 @@ extern void build_options(BOOL screen); /* register our message handlers */ message_register(MSG_SMB_FORCE_TDIS, msg_force_tdis, NULL); - if (lp_keepalive() != 0) { - struct timeval interval; - - interval.tv_sec = lp_keepalive(); - interval.tv_usec = 0; + if ((lp_keepalive() != 0) + && !(event_add_idle(smbd_event_context(), NULL, + timeval_set(lp_keepalive(), 0), + "keepalive", keepalive_fn, + NULL))) { + DEBUG(0, ("Could not add keepalive event\n")); + exit(1); + } - if (!(event_add_idle(smbd_event_context(), NULL, - interval, "keepalive", keepalive_fn, - NULL))) { - DEBUG(0, ("Could not add keepalive event\n")); - exit(1); - } + if (!(event_add_idle(smbd_event_context(), NULL, + timeval_set(IDLE_CLOSED_TIMEOUT, 0), + "deadtime", deadtime_fn, NULL))) { + DEBUG(0, ("Could not add deadtime event\n")); + exit(1); } smbd_process(); -- cgit