diff options
author | John (J5) Palmieri <johnp@redhat.com> | 2008-03-04 13:21:05 -0500 |
---|---|---|
committer | John (J5) Palmieri <johnp@redhat.com> | 2008-03-04 13:21:05 -0500 |
commit | d25151483fe0143354dc188e888a0f2d740df2da (patch) | |
tree | 207baa4bdcd6614c26bf4abc3f9586aa7de57d53 | |
parent | bd561f9a1941821c9c1d9266765b3a9d1b133e00 (diff) | |
download | dbus-d25151483fe0143354dc188e888a0f2d740df2da.tar.gz |
fix broken poll on Mac OSX - build patch by Benjamin Reed
* configure.in: check for OSX's deadlocking poll
* dbus/dbus-sysdeps-unix.c (_dbus_poll): if we have a broken poll
don't use poll
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | configure.in | 30 | ||||
-rw-r--r-- | dbus/dbus-sysdeps-unix.c | 2 |
3 files changed, 37 insertions, 2 deletions
@@ -1,5 +1,12 @@ 2008-03-04 John (J5) Palmieri <johnp@redhat.com> + * fix broken poll on Mac OSX - build patch by Benjamin Reed + * configure.in: check for OSX's deadlocking poll + * dbus/dbus-sysdeps-unix.c (_dbus_poll): if we have a broken poll + don't use poll + +2008-03-04 John (J5) Palmieri <johnp@redhat.com> + * check if the linker supports a flag instead of just checking for GNU ld * configure.in: move AM_PROG_LIBTOOL to the top diff --git a/configure.in b/configure.in index 1caf7d92..24e2431a 100644 --- a/configure.in +++ b/configure.in @@ -590,7 +590,35 @@ AC_DEFINE_UNQUOTED(DBUS_HAVE_ATOMIC_INT_COND, [$have_atomic_inc_cond], AC_CHECK_LIB(socket,socket) AC_CHECK_FUNC(gethostbyname,,[AC_CHECK_LIB(nsl,gethostbyname)]) -AC_CHECK_FUNCS(vsnprintf vasprintf nanosleep usleep poll setenv clearenv unsetenv socketpair getgrouplist fpathconf setrlimit) +AC_CHECK_FUNCS(vsnprintf vasprintf nanosleep usleep setenv clearenv unsetenv socketpair getgrouplist fpathconf setrlimit poll) + +#### Check for broken poll; taken from Glib's configure + +AC_MSG_CHECKING([for broken poll]) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include <stdlib.h> + #include <fcntl.h> + #include <poll.h> + #ifdef HAVE_SYS_POLL_H + #include <sys/poll.h> + #endif + int main(void) { + struct pollfd fds[1]; + int fd; + fd = open("/dev/null", 1); + fds[0].fd = fd; + fds[0].events = POLLIN; + fds[0].revents = 0; + if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) { + exit(1); /* Does not work for devices -- fail */ + } + exit(0); + }]])], + [broken_poll=no], + [broken_poll=yes + AC_DEFINE(BROKEN_POLL,1,[poll doesn't work on devices])], + [broken_poll="no (cross compiling)"]) +AC_MSG_RESULT($broken_poll) AC_MSG_CHECKING(for dirfd) AC_TRY_LINK([ diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index d9a9030c..19858dd3 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -1843,7 +1843,7 @@ _dbus_poll (DBusPollFD *fds, int n_fds, int timeout_milliseconds) { -#ifdef HAVE_POLL +#if defined(HAVE_POLL) && !defined(BROKEN_POLL) /* This big thing is a constant expression and should get optimized * out of existence. So it's more robust than a configure check at * no cost. |