1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

lib/util: Remove sys_poll as it is no longer needed

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>
This commit is contained in:
Andrew Bartlett 2012-02-09 13:16:55 +11:00 committed by Jeremy Allison
parent ab80995580
commit 367c567c5f
8 changed files with 14 additions and 110 deletions

View File

@ -23,96 +23,6 @@
#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;

View 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

View 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",

View 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

View 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.

View 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;

View 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);

View 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)) {