lib/util: Remove sys_poll as it is no longer needed
authorAndrew Bartlett <abartlet@samba.org>
Thu, 9 Feb 2012 02:16:55 +0000 (13:16 +1100)
committerJeremy Allison <jra@samba.org>
Thu, 16 Feb 2012 23:49:21 +0000 (15:49 -0800)
sys_poll() is only needed if the signal pipe is set up and used, but as
no signal handler ever writes to the pipe, this can all be removed.

signal based events are now handled via tevent.

Andrew Bartlett

Signed-off-by: Jeremy Allison <jra@samba.org>
lib/util/select.c
lib/util/select.h
source3/lib/events.c
source3/lib/g_lock.c
source3/lib/util_sock.c
source3/nmbd/nmbd_packets.c
source3/smbd/process.c
source3/winbindd/winbindd_dual.c

index 63be55cf0c6b703e0068233d3aa8c1425e55821f..5e66344c9dac4645fbf64b7a39f4bfa60624b97e 100644 (file)
 #include "system/select.h"
 #include "lib/util/select.h"
 
-/* This is here because it allows us to avoid a nasty race in signal handling.
-   We need to guarantee that when we get a signal we get out of a select immediately
-   but doing that involves a race condition. We can avoid the race by getting the
-   signal handler to write to a pipe that is in the select/poll list
-
-   This means all Samba signal handlers should call sys_select_signal().
-*/
-
-static pid_t initialised;
-static int select_pipe[2];
-static volatile unsigned pipe_written, pipe_read;
-
-/*
- * sys_poll expects pollfd's to be a talloc'ed array.
- *
- * It expects the talloc_array_length(fds) >= num_fds+1 to give space
- * to the signal pipe.
- */
-
-int sys_poll(struct pollfd *fds, int num_fds, int timeout)
-{
-       int ret;
-
-       if (talloc_array_length(fds) < num_fds+1) {
-               errno = ENOSPC;
-               return -1;
-       }
-
-       if (initialised != sys_getpid()) {
-               if (pipe(select_pipe) == -1)
-               {
-                       int saved_errno = errno;
-                       DEBUG(0, ("sys_poll: pipe failed (%s)\n",
-                               strerror(errno)));
-                       errno = saved_errno;
-                       return -1;
-               }
-
-               /*
-                * These next two lines seem to fix a bug with the Linux
-                * 2.0.x kernel (and probably other UNIXes as well) where
-                * the one byte read below can block even though the
-                * select returned that there is data in the pipe and
-                * the pipe_written variable was incremented. Thanks to
-                * HP for finding this one. JRA.
-                */
-
-               if(set_blocking(select_pipe[0],0)==-1)
-                       smb_panic("select_pipe[0]: O_NONBLOCK failed");
-               if(set_blocking(select_pipe[1],0)==-1)
-                       smb_panic("select_pipe[1]: O_NONBLOCK failed");
-
-               initialised = sys_getpid();
-       }
-
-       ZERO_STRUCT(fds[num_fds]);
-       fds[num_fds].fd = select_pipe[0];
-       fds[num_fds].events = POLLIN|POLLHUP;
-
-       errno = 0;
-       ret = poll(fds, num_fds+1, timeout);
-
-       if ((ret >= 0) && (fds[num_fds].revents & (POLLIN|POLLHUP|POLLERR))) {
-               char c;
-               int saved_errno = errno;
-
-               if (read(select_pipe[0], &c, 1) == 1) {
-                       pipe_read += 1;
-
-                       /* Mark Weaver <mark-clist@npsl.co.uk> pointed out a critical
-                          fix to ensure we don't lose signals. We must always
-                          return -1 when the select pipe is set, otherwise if another
-                          fd is also ready (so ret == 2) then we used to eat the
-                          byte in the pipe and lose the signal. JRA.
-                       */
-                       ret = -1;
-#if 0
-                       /* JRA - we can use this to debug the signal messaging... */
-                       DEBUG(0,("select got %u signal\n", (unsigned int)c));
-#endif
-                       errno = EINTR;
-               } else {
-                       ret -= 1;
-                       errno = saved_errno;
-               }
-       }
-
-       return ret;
-}
-
 int sys_poll_intr(struct pollfd *fds, int num_fds, int timeout)
 {
        int orig_timeout = timeout;
index bfc78a99d2f70638dc84403a7e04b4524c398a22..fa1970ec016679744a542fa6dce0ad460a975498 100644 (file)
@@ -24,7 +24,6 @@
 
 /* The following definitions come from lib/util/select.c  */
 
-int sys_poll(struct pollfd *fds, int num_fds, int timeout);
 int sys_poll_intr(struct pollfd *fds, int num_fds, int timeout);
 
 #endif
index 77589f8e7e2060d83d1ffca952e7c1c599ac9c65..c71876ce39df3be83dd5da9a0742a66868f9c807 100644 (file)
@@ -101,14 +101,9 @@ bool event_add_to_poll_args(struct tevent_context *ev, TALLOC_CTX *mem_ctx,
        fds = *pfds;
        num_pollfds = *pnum_pfds;
 
-       /*
-        * The +1 is for the sys_poll calling convention. It expects
-        * an array 1 longer for the signal pipe
-        */
-
-       if (talloc_array_length(fds) < num_pollfds + num_fds + 1) {
+       if (talloc_array_length(fds) < num_pollfds + num_fds) {
                fds = talloc_realloc(mem_ctx, fds, struct pollfd,
-                                          num_pollfds + num_fds + 1);
+                                          num_pollfds + num_fds);
                if (fds == NULL) {
                        DEBUG(10, ("talloc_realloc failed\n"));
                        return false;
@@ -338,7 +333,7 @@ static int s3_event_loop_once(struct tevent_context *ev, const char *location)
                return -1;
        }
 
-       ret = sys_poll(state->pfds, num_pfds, timeout);
+       ret = poll(state->pfds, num_pfds, timeout);
        if (ret == -1 && errno != EINTR) {
                tevent_debug(ev, TEVENT_DEBUG_FATAL,
                             "poll() failed: %d:%s\n",
index 1fd8ae9f387ee8f1d81817e8ae8053034e1337f5..1011584a254c2fbed12c8ac5426a35efb65f89ee 100644 (file)
@@ -395,11 +395,11 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name,
                 */
 
                /*
-                * We allocate 2 entries here. One is needed anyway for
-                * sys_poll and in the clustering case we might have to add
-                * the ctdb fd. This avoids the realloc then.
+                * We allocate 1 entries here. In the clustering case
+                * we might have to add the ctdb fd. This avoids the
+                * realloc then.
                 */
-               pollfds = talloc_array(talloc_tos(), struct pollfd, 2);
+               pollfds = talloc_array(talloc_tos(), struct pollfd, 1);
                if (pollfds == NULL) {
                        status = NT_STATUS_NO_MEMORY;
                        break;
@@ -425,8 +425,8 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name,
                select_timeout = timeval_min(&select_timeout,
                                             &timeout_remaining);
 
-               ret = sys_poll(pollfds, num_pollfds,
-                              timeval_to_msec(select_timeout));
+               ret = poll(pollfds, num_pollfds,
+                          timeval_to_msec(select_timeout));
 
                /*
                 * We're not *really interested in the actual flags. We just
index dcc41bb699e15c13bfbf5a2542d8bd63651c84ea..69e33f77250cb95fba3c27f4ea65a444854fbd04 100644 (file)
@@ -1604,7 +1604,7 @@ int poll_one_fd(int fd, int events, int timeout, int *revents)
        int ret;
        int saved_errno;
 
-       fds = talloc_zero_array(talloc_tos(), struct pollfd, 2);
+       fds = talloc_zero_array(talloc_tos(), struct pollfd, 1);
        if (fds == NULL) {
                errno = ENOMEM;
                return -1;
@@ -1612,7 +1612,7 @@ int poll_one_fd(int fd, int events, int timeout, int *revents)
        fds[0].fd = fd;
        fds[0].events = events;
 
-       ret = sys_poll(fds, 1, timeout);
+       ret = poll(fds, 1, timeout);
 
        /*
         * Assign whatever poll did, even in the ret<=0 case.
index edac6f6b9ff3c12a66608e489a99d8478c8fb44e..81e2f7f6732784beb0a1fe08536bb448a78b02c6 100644 (file)
@@ -1935,7 +1935,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election)
        event_add_to_poll_args(nmbd_event_context(), NULL,
                               &fds, &num_sockets, &timeout);
 
-       pollrtn = sys_poll(fds, num_sockets, timeout);
+       pollrtn = poll(fds, num_sockets, timeout);
 
        if (run_events_poll(nmbd_event_context(), pollrtn, fds, num_sockets)) {
                return False;
index 2f8f88fa2acb3589022424b524e532d306cedbef..f295a59f86f85017b80d9cb4ce442bd074d9998a 100644 (file)
@@ -967,7 +967,7 @@ static NTSTATUS smbd_server_connection_loop_once(struct tevent_context *ev_ctx,
                int sav;
                START_PROFILE(smbd_idle);
 
-               ret = sys_poll(conn->pfds, num_pfds, timeout);
+               ret = poll(conn->pfds, num_pfds, timeout);
                sav = errno;
 
                END_PROFILE(smbd_idle);
index d0bcd3bd402a47bd811607efc1fd43677d8fc002..f11dae7e0827e628ed8063d02a8c52221c657046 100644 (file)
@@ -1507,7 +1507,7 @@ static bool fork_domain_child(struct winbindd_child *child)
                                (unsigned int)tp->tv_sec, (unsigned int)tp->tv_usec ));
                }
 
-               ret = sys_poll(pfds, num_pfds, timeout);
+               ret = poll(pfds, num_pfds, timeout);
 
                if (run_events_poll(winbind_event_context(), ret,
                                    pfds, num_pfds)) {