X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fhousekeeping.c;h=8ede483c6497f60dabba23c9da7e68f4329aaccf;hb=098337ce1d9d2c29e8e824fd8d2d650226c91138;hp=e8c060c7bf0d075fa0e075fc81f02a332ea111b4;hpb=dafc7152feffcb1ae90f951bba71c4d82ab037e4;p=citadel.git diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index e8c060c7b..8ede483c6 100644 --- a/citadel/housekeeping.c +++ b/citadel/housekeeping.c @@ -31,20 +31,29 @@ void terminate_idle_sessions(void) { struct CitContext *ccptr; time_t now; + int session_to_kill; -START_OVER: - now = time(NULL); - for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { - if ( (ccptr!=CC) - && (config.c_sleeping > 0) - && (now - (ccptr->lastcmd) > config.c_sleeping) ) { + do { + now = time(NULL); + session_to_kill = 0; + lprintf(9, "Scanning for timed out sessions...\n"); + begin_critical_section(S_SESSION_TABLE); + for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { + if ( (ccptr!=CC) + && (config.c_sleeping > 0) + && (now - (ccptr->lastcmd) > config.c_sleeping) ) { + session_to_kill = ccptr->cs_pid; + } + } + end_critical_section(S_SESSION_TABLE); + lprintf(9, "...done scanning.\n"); + if (session_to_kill > 0) { lprintf(3, "Session %d timed out. Terminating it...\n", ccptr->cs_pid); kill_session(ccptr->cs_pid); lprintf(9, "...done terminating it.\n"); - goto START_OVER; } - } + } while(session_to_kill > 0); }