]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
r21871: Move deadtime processing into an idle event. While there, simplify
authorVolker Lendecke <vlendec@samba.org>
Sun, 18 Mar 2007 13:19:40 +0000 (13:19 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:18:41 +0000 (12:18 -0500)
conn_idle_all() a bit.

Volker

source/smbd/conn.c
source/smbd/process.c
source/smbd/server.c

index 2d4020af39c591bf283b12ddfd65f4d73e360782..388cd004f989d3477c95bf69119389c6a7753d35 100644 (file)
@@ -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)<deadtime) {
-                       allidle = False;
+               if (conn->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);
index 76af8f2054ca342e9be0bac09056543f52cd4ea8..6497dfa97b906cf89c32c80e94f510eda7f67c03 100644 (file)
@@ -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 */
index 0d4953e5b80a026e8d4b80e8aa0edcef33f5f766..3f4313ce7f8505662783a2e92b123d46148a4c14 100644 (file)
@@ -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();