diff options
author | Stefan Metzmacher <metze@samba.org> | 2011-01-24 08:47:38 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2011-01-31 16:16:09 +0100 |
commit | 19d3779274314bb4ce76e3afaa21cf37de7b2b98 (patch) | |
tree | b7063d6abd080fd0fefa8cb7f07822fb06f4d2e5 /source3/smbd | |
parent | 1537f5dab1d947fddee05b27c7feb5c7e83e83a2 (diff) | |
download | samba-19d3779274314bb4ce76e3afaa21cf37de7b2b98.tar.gz samba-19d3779274314bb4ce76e3afaa21cf37de7b2b98.tar.bz2 samba-19d3779274314bb4ce76e3afaa21cf37de7b2b98.zip |
Revert "s3:events: Call all ready fd event handlers on each iteration of the main loop"
This reverts commit 455fccf86b6544cd17a2571c63a88f8aebff3f74.
I'll add a more generic fix for this problem.
metze
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/process.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 12ea28a399..04ea747564 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -963,7 +963,7 @@ void smbd_setup_sig_hup_handler(struct tevent_context *ev, static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *conn) { fd_set r_fds, w_fds; - int selrtn = 0; + int selrtn; struct timeval to; int maxfd = 0; @@ -986,7 +986,7 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection * &r_fds, &w_fds, &to, &maxfd); /* Process a signal and timed events now... */ - if (run_events(smbd_event_context(), &selrtn, NULL, NULL)) { + if (run_events(smbd_event_context(), 0, NULL, NULL)) { return NT_STATUS_RETRY; } @@ -1003,23 +1003,26 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection * /* Check if error */ if (selrtn == -1) { - if (errno == EINTR) - return NT_STATUS_RETRY; - else - /* Maybe the socket is dead? */ - return map_nt_error_from_unix(errno); - } - - /* Process events until all available fds have been handled. - * This allows for fair round-robin handling of all available fds - * on each select() wakeup, while still maintaining responsiveness - * by re-checking for signal and timed events between the handling - * of each ready fd. */ - do { - run_events(smbd_event_context(), &selrtn, &r_fds, &w_fds); - } while (selrtn > 0); + /* something is wrong. Maybe the socket is dead? */ + return map_nt_error_from_unix(errno); + } + + if ((conn->smb1.echo_handler.trusted_fd != -1) + && FD_ISSET(conn->sock, &r_fds) + && FD_ISSET(conn->smb1.echo_handler.trusted_fd, &r_fds)) { + /* + * Prefer to read pending requests from the echo handler. To + * quote Jeremy (da70f8ab1): This is a hack of monstrous + * proportions... + */ + FD_CLR(conn->sock, &r_fds); + } + + if (run_events(smbd_event_context(), selrtn, &r_fds, &w_fds)) { + return NT_STATUS_RETRY; + } - /* Processed all fds or timed out */ + /* Did we timeout ? */ if (selrtn == 0) { return NT_STATUS_RETRY; } |