summaryrefslogtreecommitdiff
path: root/dbus
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2018-10-22 11:45:45 +0100
committerSimon McVittie <smcv@collabora.com>2018-10-22 16:45:33 +0000
commit0414ea65ca8196e328da09c3a2324d7765fba8c4 (patch)
tree4c42caded4e3d5798267ace917a7b636a2b18b1a /dbus
parent86ae83d468577c2a8f41780d3048bcc589b6e36c (diff)
downloaddbus-0414ea65ca8196e328da09c3a2324d7765fba8c4.tar.gz
build: Never use poll() on Darwin family (macOS, etc.) or Interix
Doing a runtime check in configure.ac (AC_RUN_IFELSE) has several disadvantages: * It doesn't work when cross-compiling. For example, if we build macOS binaries on a Linux system, we'd assume that poll() works, but in fact it won't. * It checks the build system capabilities, but that is not necessarily appropriate if (for example) a macOS 10.10 user builds binaries that could be used by macOS 10.12 or macOS 10.9 users. * It checks for one specific failure mode, but macOS seems to have a history of various implementation issues in poll(). * If we want it to work in CMake, we have to duplicate it in the CMake build system. None of these is a showstopper on its own, but the combination of all of them makes the current approach to avoiding the broken poll() on macOS look unreliable. libcurl, a widely-portable library making extensive use of sockets, specifically doesn't use poll() on Darwin (macOS, iOS, etc.) or on Interix; let's follow their example here. See also https://bugzilla.gnome.org/show_bug.cgi?id=302672 and https://daniel.haxx.se/blog/2016/10/11/poll-on-mac-10-12-is-broken/ for some relevant history. Signed-off-by: Simon McVittie <smcv@collabora.com> Resolves: https://gitlab.freedesktop.org/dbus/dbus/issues/232
Diffstat (limited to 'dbus')
-rw-r--r--dbus/dbus-sysdeps.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h
index 8642dda5..a5987ae5 100644
--- a/dbus/dbus-sysdeps.h
+++ b/dbus/dbus-sysdeps.h
@@ -48,6 +48,32 @@
#include <string.h>
#include <stdarg.h>
+#if !defined(BROKEN_POLL) && (defined(__APPLE__) || defined(__INTERIX))
+ /* Following libcurl's example, we blacklist poll() on Darwin
+ * (macOS, iOS, etc.) and Interix due to a history of implementation
+ * issues.
+ * https://github.com/curl/curl/blob/master/m4/curl-functions.m4
+ *
+ * On unspecified older macOS versions, poll() failed if given a
+ * device node to poll.
+ *
+ * On macOS < 10.9, poll() with nfds=0 failed instead of waiting for
+ * the timeout and then succeeding.
+ *
+ * On macOS >= 10.12, poll() with nfds=0 succeeded immediately
+ * instead of waiting for the timeout, resulting in busy-looping.
+ *
+ * On Interix, poll() apparently only works for files in /proc.
+ *
+ * The "legacy" build flavour in our CI machinery defines BROKEN_POLL
+ * on whatever platform is in use (normally Linux) to force use of the
+ * same select()-based poll() emulation that we use for macOS, Interix,
+ * and any platform that lacks a real poll(), so that we can test it
+ * more regularly.
+ */
+# define BROKEN_POLL
+#endif
+
/* AIX sys/poll.h does #define events reqevents, and other
* wonderousness, so must include sys/poll before declaring
* DBusPollFD