s3: always call run_events() before and after sys_select()
authorStefan Metzmacher <metze@samba.org>
Tue, 20 Jan 2009 03:14:20 +0000 (04:14 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 22 Jan 2009 11:37:29 +0000 (12:37 +0100)
And always setup the fd events.

metze

source3/nmbd/nmbd_packets.c
source3/smbd/process.c
source3/smbd/server.c
source3/winbindd/winbindd.c
source3/winbindd/winbindd_dual.c

index 66b584ad540f1f382283734fde16c509ff04788d..489034899e653249e11c0fe3ad026acc9f80595f 100644 (file)
@@ -1773,6 +1773,11 @@ bool listen_for_packets(bool run_election)
        }
 #endif
 
+       /* Process a signal and timer events now... */
+       if (run_events(nmbd_event_context(), 0, NULL, NULL)) {
+               return False;
+       }
+
        /*
         * During elections and when expecting a netbios response packet we
         * need to send election packets at tighter intervals.
@@ -1789,13 +1794,6 @@ bool listen_for_packets(bool run_election)
                                         &r_fds, &w_fds, &timeout, &maxfd);
        }
 
-       if (timeval_is_zero(&timeout)) {
-               /* Process a timed event now... */
-               if (run_events(nmbd_event_context(), 0, NULL, NULL)) {
-                       return False;
-               }
-       }
-
        /* Prepare for the select - allow certain signals. */
 
        BlockSignals(False, SIGTERM);
@@ -1806,11 +1804,11 @@ bool listen_for_packets(bool run_election)
 
        BlockSignals(True, SIGTERM);
 
-       if(selrtn == -1) {
+       if (run_events(nmbd_event_context(), selrtn, &r_fds, &w_fds)) {
                return False;
        }
 
-       if (run_events(nmbd_event_context(), selrtn, &r_fds, &w_fds)) {
+       if (selrtn == -1) {
                return False;
        }
 
index 44cacfafddd97cd3e5f41bfd5bf0a6d6e36c364a..7847505f7c106e995dbb699b72e95e8697b7cc73 100644 (file)
@@ -818,13 +818,11 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
                                         &r_fds, &w_fds, &to, &maxfd);
        }
 
-       if (timeval_is_zero(&to)) {
-               /* Process a timed event now... */
-               if (run_events(smbd_event_context(), 0, NULL, NULL)) {
-                       return NT_STATUS_RETRY;
-               }
+       /* Process a signal and timed events now... */
+       if (run_events(smbd_event_context(), 0, NULL, NULL)) {
+               return NT_STATUS_RETRY;
        }
-       
+
        {
                int sav;
                START_PROFILE(smbd_idle);
index 42c37f205622e9c3c42e5c9411a658602a535629..163d0b81beade2d140c5ae76f9429eb09bfe4a60 100644 (file)
@@ -602,6 +602,10 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                        }
                }
 
+               if (run_events(smbd_event_context(), 0, NULL, NULL)) {
+                       continue;
+               }
+
                idle_timeout = timeval_zero();
 
                memcpy((char *)&r_fds, (char *)&listen_set,
@@ -623,6 +627,10 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                                 timeval_is_zero(&idle_timeout) ?
                                 NULL : &idle_timeout);
 
+               if (run_events(smbd_event_context(), num, &r_fds, &w_fds)) {
+                       continue;
+               }
+
                if (num == -1 && errno == EINTR) {
                        if (got_sig_term) {
                                exit_server_cleanly(NULL);
@@ -653,10 +661,6 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                        --num;
                }
 
-               if (run_events(smbd_event_context(), num, &r_fds, &w_fds)) {
-                       continue;
-               }
-
                /* check if we need to reload services */
                check_reload(time(NULL));
 
index 821812925c6d4818f05959dbc46019afe61a8c30..0bdc75ccd48becc68be0c4fda673aab6e1d21935 100644 (file)
@@ -980,6 +980,8 @@ static void process_loop(void)
 
  no_fds_ready:
 
+       run_events(winbind_event_context(), selret, &r_fds, &w_fds);
+
 #if 0
        winbindd_check_cache_size(time(NULL));
 #endif
index 4b57d08b03fd1388f383a47edceb5c3b55a7ff12..2a85f6e0d4e62e23a6e3c96e48bf9b12cce84f00 100644 (file)
@@ -1371,7 +1371,9 @@ static bool fork_domain_child(struct winbindd_child *child)
        while (1) {
 
                int ret;
-               fd_set read_fds;
+               fd_set r_fds;
+               fd_set w_fds;
+               int maxfd;
                struct timeval t;
                struct timeval *tp;
                struct timeval now;
@@ -1382,7 +1384,14 @@ static bool fork_domain_child(struct winbindd_child *child)
                winbind_check_sighup(override_logfile ? NULL :
                                child->logfilename);
 
-               run_events(winbind_event_context(), 0, NULL, NULL);
+               /* Handle messages */
+
+               message_dispatch(winbind_messaging_context());
+
+               if (run_events(winbind_event_context(), 0, NULL, NULL)) {
+                       TALLOC_FREE(frame);
+                       continue;
+               }
 
                GetTimeOfDay(&now);
 
@@ -1394,20 +1403,26 @@ static bool fork_domain_child(struct winbindd_child *child)
                        child->domain->startup = False;
                }
 
+               FD_ZERO(&r_fds);
+               FD_ZERO(&w_fds);
+               FD_SET(state.sock, &r_fds);
+               maxfd = state.sock;
+
+               event_add_to_select_args(winbind_event_context(), &now,
+                                        &r_fds, &w_fds, &t, &maxfd);
                tp = get_timed_events_timeout(winbind_event_context(), &t);
                if (tp) {
                        DEBUG(11,("select will use timeout of %u.%u seconds\n",
                                (unsigned int)tp->tv_sec, (unsigned int)tp->tv_usec ));
                }
 
-               /* Handle messages */
-
-               message_dispatch(winbind_messaging_context());
-
-               FD_ZERO(&read_fds);
-               FD_SET(state.sock, &read_fds);
+               ret = sys_select(maxfd + 1, &r_fds, &w_fds, NULL, tp);
 
-               ret = sys_select(state.sock + 1, &read_fds, NULL, NULL, tp);
+               if (run_events(winbind_event_context(), ret, &r_fds, &w_fds)) {
+                       /* We got a signal - continue. */
+                       TALLOC_FREE(frame);
+                       continue;
+               }
 
                if (ret == 0) {
                        DEBUG(11,("nothing is ready yet, continue\n"));