diff options
-rw-r--r-- | source3/lib/events.c | 8 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_dual.c | 5 | ||||
-rw-r--r-- | source3/smbd/process.c | 15 |
3 files changed, 17 insertions, 11 deletions
diff --git a/source3/lib/events.c b/source3/lib/events.c index 133752c78e..242c198511 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -103,16 +103,12 @@ void run_events(void) return; } -struct timeval *get_timed_events_timeout(struct timeval *to_ret, time_t default_to) +struct timeval *get_timed_events_timeout(struct timeval *to_ret) { struct timeval now; if (timed_events == NULL) { - if (default_to == (time_t)-1) { - return NULL; - } - *to_ret = timeval_set(default_to, 0); - return to_ret; + return NULL; } now = timeval_current(); diff --git a/source3/nsswitch/winbindd_dual.c b/source3/nsswitch/winbindd_dual.c index d978a6adf7..c5d24f98c1 100644 --- a/source3/nsswitch/winbindd_dual.c +++ b/source3/nsswitch/winbindd_dual.c @@ -684,9 +684,10 @@ static BOOL fork_domain_child(struct winbindd_child *child) GetTimeOfDay(&now); - tp = get_timed_events_timeout(&t, (time_t)-1); + tp = get_timed_events_timeout(&t); if (tp) { - DEBUG(11,("select will use timeout of %d seconds\n", (int)tp->tv_sec)); + DEBUG(11,("select will use timeout of %u.%u seconds\n", + (unsigned int)tp->tv_sec, (unsigned int)tp->tv_usec )); } /* Handle messages */ diff --git a/source3/smbd/process.c b/source3/smbd/process.c index c0a43e99dd..ba14e57c54 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -357,7 +357,7 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout) { fd_set fds; int selrtn; - struct timeval to = timeval_set(SMBD_SELECT_TIMEOUT, 0); + struct timeval to; int maxfd = 0; smb_read_error = 0; @@ -367,6 +367,9 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout) if (timeout >= 0) { to.tv_sec = timeout / 1000; to.tv_usec = (timeout % 1000) * 1000; + } else { + to.tv_sec = SMBD_SELECT_TIMEOUT; + to.tv_usec = 0; } /* @@ -441,14 +444,20 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout) goto again; } + /* + * Are there any timed events waiting ? If so, ensure we don't + * select for longer than it would take to wait for them. + */ + { struct timeval tmp; - struct timeval *tp = get_timed_events_timeout(&tmp,SMBD_SELECT_TIMEOUT); + struct timeval *tp = get_timed_events_timeout(&tmp); if (tp) { to = timeval_min(&to, tp); if (timeval_is_zero(&to)) { - return True; + /* Process a timed event now... */ + run_events(); } } } |