summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn (J5) Palmieri <johnp@redhat.com>2008-03-04 13:21:05 -0500
committerJohn (J5) Palmieri <johnp@redhat.com>2008-03-04 13:21:05 -0500
commitd25151483fe0143354dc188e888a0f2d740df2da (patch)
tree207baa4bdcd6614c26bf4abc3f9586aa7de57d53
parentbd561f9a1941821c9c1d9266765b3a9d1b133e00 (diff)
downloaddbus-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--ChangeLog7
-rw-r--r--configure.in30
-rw-r--r--dbus/dbus-sysdeps-unix.c2
3 files changed, 37 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 28497bc8..96cecd01 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.