poll() is totally broken on Mac OS X

Even on 10.5.8, poll() does not do the right thing. Haven't checked on
newer versions. Hence, wrap all occurences of poll() to pa_poll and
emulate that call with select() on OSX. This is totally embarassing.
This commit is contained in:
Daniel Mack 2009-11-23 00:12:18 +01:00
parent 962164a3b7
commit 17d34462ea
12 changed files with 34 additions and 40 deletions

View file

@ -32,7 +32,6 @@
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/poll.h>
#include <pulse/rtclock.h> #include <pulse/rtclock.h>
#include <pulse/timeval.h> #include <pulse/timeval.h>
@ -48,6 +47,7 @@
#include <pulsecore/thread.h> #include <pulsecore/thread.h>
#include <pulsecore/thread-mq.h> #include <pulsecore/thread-mq.h>
#include <pulsecore/rtpoll.h> #include <pulsecore/rtpoll.h>
#include <pulsecore/poll.h>
#include "module-sine-source-symdef.h" #include "module-sine-source-symdef.h"

View file

@ -32,7 +32,6 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#include <poll.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/tcp.h> #include <netinet/tcp.h>
@ -60,6 +59,7 @@
#include <pulsecore/thread.h> #include <pulsecore/thread.h>
#include <pulsecore/time-smoother.h> #include <pulsecore/time-smoother.h>
#include <pulsecore/socket-util.h> #include <pulsecore/socket-util.h>
#include <pulsecore/poll.h>
#include "module-raop-sink-symdef.h" #include "module-raop-sink-symdef.h"
#include "rtp.h" #include "rtp.h"

View file

@ -51,12 +51,7 @@
#include <pulsecore/macro.h> #include <pulsecore/macro.h>
#include <pulsecore/strbuf.h> #include <pulsecore/strbuf.h>
#include <pulsecore/random.h> #include <pulsecore/random.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#else
#include <pulsecore/poll.h> #include <pulsecore/poll.h>
#endif
#include "raop_client.h" #include "raop_client.h"
#include "rtsp_client.h" #include "rtsp_client.h"

View file

@ -45,12 +45,7 @@
#include <pulsecore/macro.h> #include <pulsecore/macro.h>
#include <pulsecore/strbuf.h> #include <pulsecore/strbuf.h>
#include <pulsecore/ioline.h> #include <pulsecore/ioline.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#else
#include <pulsecore/poll.h> #include <pulsecore/poll.h>
#endif
#include "rtsp_client.h" #include "rtsp_client.h"

View file

@ -32,12 +32,6 @@
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#else
#include <pulsecore/poll.h>
#endif
#ifndef HAVE_PIPE #ifndef HAVE_PIPE
#include <pulsecore/pipe.h> #include <pulsecore/pipe.h>
#endif #endif
@ -47,6 +41,7 @@
#include <pulse/timeval.h> #include <pulse/timeval.h>
#include <pulse/xmalloc.h> #include <pulse/xmalloc.h>
#include <pulsecore/poll.h>
#include <pulsecore/core-rtclock.h> #include <pulsecore/core-rtclock.h>
#include <pulsecore/core-util.h> #include <pulsecore/core-util.h>
#include <pulsecore/llist.h> #include <pulsecore/llist.h>
@ -887,7 +882,7 @@ int pa_mainloop_poll(pa_mainloop *m) {
m->prepared_timeout == PA_USEC_INVALID ? NULL : pa_timespec_store(&ts, m->prepared_timeout), m->prepared_timeout == PA_USEC_INVALID ? NULL : pa_timespec_store(&ts, m->prepared_timeout),
NULL); NULL);
#else #else
m->poll_func_ret = poll( m->poll_func_ret = pa_poll(
m->pollfds, m->n_pollfds, m->pollfds, m->n_pollfds,
usec_to_timeout(m->prepared_timeout)); usec_to_timeout(m->prepared_timeout));
#endif #endif

View file

@ -33,6 +33,7 @@
#include <pulse/i18n.h> #include <pulse/i18n.h>
#include <pulse/xmalloc.h> #include <pulse/xmalloc.h>
#include <pulsecore/poll.h>
#include <pulsecore/mutex.h> #include <pulsecore/mutex.h>
#include <pulsecore/thread.h> #include <pulsecore/thread.h>
#include <pulsecore/core-util.h> #include <pulsecore/core-util.h>
@ -182,7 +183,7 @@ static void wait_for_ping(void) {
pfd.fd = pipe_fd[0]; pfd.fd = pipe_fd[0];
pfd.events = POLLIN; pfd.events = POLLIN;
if ((k = poll(&pfd, 1, -1)) != 1) { if ((k = pa_poll(&pfd, 1, -1)) != 1) {
pa_assert(k < 0); pa_assert(k < 0);
pa_assert(errno == EINTR); pa_assert(errno == EINTR);
} else if ((s = read(pipe_fd[0], &x, 1)) != 1) { } else if ((s = read(pipe_fd[0], &x, 1)) != 1) {

View file

@ -43,13 +43,18 @@
#include "winsock.h" #include "winsock.h"
#ifndef HAVE_POLL_H
#include <pulsecore/core-util.h> #include <pulsecore/core-util.h>
#include <pulse/util.h>
#include "poll.h" #include "poll.h"
int poll (struct pollfd *fds, unsigned long int nfds, int timeout) { /* Mac OSX fails to implement poll() in a working way since 10.4. IOW, for
* several years. We need to enable a dirty workaround and emulate that call
* with select(), just like for Windows. sic! */
#if !defined(HAVE_POLL_H) || defined(OS_IS_DARWIN)
int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
struct timeval tv; struct timeval tv;
fd_set rset, wset, xset; fd_set rset, wset, xset;
struct pollfd *f; struct pollfd *f;

View file

@ -24,6 +24,10 @@
Copyright (C) 1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc. Copyright (C) 1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc.
***/ ***/
#if defined(HAVE_POLL_H)
#include <poll.h>
#else
/* Event types that can be polled for. These bits may be set in `events' /* Event types that can be polled for. These bits may be set in `events'
to indicate the interesting event types; they will appear in `revents' to indicate the interesting event types; they will appear in `revents'
to indicate the status of the file descriptor. */ to indicate the status of the file descriptor. */
@ -38,10 +42,6 @@
#define POLLHUP 0x010 /* Hung up. */ #define POLLHUP 0x010 /* Hung up. */
#define POLLNVAL 0x020 /* Invalid polling request. */ #define POLLNVAL 0x020 /* Invalid polling request. */
/* Type used for the number of file descriptors. */
typedef unsigned long int nfds_t;
/* Data structure describing a polling request. */ /* Data structure describing a polling request. */
struct pollfd struct pollfd
{ {
@ -50,9 +50,17 @@ struct pollfd
short int revents; /* Types of events that actually occurred. */ short int revents; /* Types of events that actually occurred. */
}; };
/* Poll the file descriptors described by the NFDS structures starting at /* Poll the file descriptors described by the NFDS structures starting at
FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
an event to occur; if TIMEOUT is -1, block until an event occurs. an event to occur; if TIMEOUT is -1, block until an event occurs.
Returns the number of file descriptors with events, zero if timed out, Returns the number of file descriptors with events, zero if timed out,
or -1 for errors. */ or -1 for errors. */
extern int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout);
#endif /* HAVE_POLL_H */
#if defined(HAVE_POLL_H) && !defined(OS_IS_DARWIN)
#define pa_poll(fds,nfds,timeout) poll((fds),(nfds),(timeout))
#else
int pa_poll (struct pollfd *fds, unsigned long nfds, int timeout);
#endif

View file

@ -30,15 +30,10 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#else
#include <pulsecore/poll.h>
#endif
#include <pulse/xmalloc.h> #include <pulse/xmalloc.h>
#include <pulse/timeval.h> #include <pulse/timeval.h>
#include <pulsecore/poll.h>
#include <pulsecore/core-error.h> #include <pulsecore/core-error.h>
#include <pulsecore/core-rtclock.h> #include <pulsecore/core-rtclock.h>
#include <pulsecore/macro.h> #include <pulsecore/macro.h>
@ -304,7 +299,7 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait_op) {
r = ppoll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? &ts : NULL, NULL); r = ppoll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? &ts : NULL, NULL);
} }
#else #else
r = poll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? (int) ((timeout.tv_sec*1000) + (timeout.tv_usec / 1000)) : -1); r = pa_poll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? (int) ((timeout.tv_sec*1000) + (timeout.tv_usec / 1000)) : -1);
#endif #endif
p->timer_elapsed = r == 0; p->timer_elapsed = r == 0;

View file

@ -23,9 +23,9 @@
#include <config.h> #include <config.h>
#endif #endif
#include <sys/poll.h>
#include <string.h> #include <string.h>
#include <pulsecore/poll.h>
#include <pulsecore/macro.h> #include <pulsecore/macro.h>
#include <pulsecore/thread.h> #include <pulsecore/thread.h>
#include <pulsecore/lock-autospawn.h> #include <pulsecore/lock-autospawn.h>
@ -69,7 +69,7 @@ static void thread_func2(void *k) {
pollfd.fd = fd; pollfd.fd = fd;
pollfd.events = POLLIN; pollfd.events = POLLIN;
pa_assert_se(poll(&pollfd, 1, -1) == 1); pa_assert_se(pa_poll(&pollfd, 1, -1) == 1);
pa_log("%i, woke up", PA_PTR_TO_INT(k)); pa_log("%i, woke up", PA_PTR_TO_INT(k));
} }

View file

@ -22,8 +22,8 @@
#endif #endif
#include <signal.h> #include <signal.h>
#include <poll.h>
#include <pulsecore/poll.h>
#include <pulsecore/log.h> #include <pulsecore/log.h>
#include <pulsecore/rtpoll.h> #include <pulsecore/rtpoll.h>

View file

@ -25,7 +25,6 @@
#include <assert.h> #include <assert.h>
#include <signal.h> #include <signal.h>
#include <sys/poll.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
@ -38,6 +37,7 @@
#include <pulse/xmalloc.h> #include <pulse/xmalloc.h>
#include <pulse/i18n.h> #include <pulse/i18n.h>
#include <pulsecore/poll.h>
#include <pulsecore/macro.h> #include <pulsecore/macro.h>
#include <pulsecore/core-util.h> #include <pulsecore/core-util.h>
#include <pulsecore/log.h> #include <pulsecore/log.h>
@ -153,7 +153,7 @@ int main(int argc, char*argv[]) {
else if (!ibuf_eof) else if (!ibuf_eof)
pollfd[WATCH_STDIN].events |= POLLIN; pollfd[WATCH_STDIN].events |= POLLIN;
if (poll(pollfd, N_WATCH, -1) < 0) { if (pa_poll(pollfd, N_WATCH, -1) < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;