This patch enables lttng-tools to run on top of glibc 2.8.
Overall it fixes 2 things:
1. No support for epoll_create1(..) and EPOLL_CLOEXEC.
2. No support for htobe/betoh
For 1, we revert back to epoll_create() and then sets CLOEXEC through
fcntl instead.
For 2, we define htobe/betoh as part of the compat/endian.h and make
sure that any users of those functions actually include compat/endian.h
instead of implicit include of system endian.h
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tested-by: Jesper Derehag <jderehag@hotmail.com>
Signed-off-by: Jesper Derehag <jderehag@hotmail.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
#include <common/common.h>
#include <common/sessiond-comm/relayd.h>
+#include <common/compat/endian.h>
+
#include "cmd-generic.h"
#include "cmd-2-1.h"
#include "utils.h"
#include <common/common.h>
#include <common/sessiond-comm/relayd.h>
+#include <common/compat/endian.h>
+
#include "cmd-generic.h"
#include "lttng-relayd.h"
#include <common/common.h>
#include <common/compat/poll.h>
#include <common/compat/socket.h>
+#include <common/compat/endian.h>
#include <common/defaults.h>
#include <common/futex.h>
#include <common/index/index.h>
#include <common/common.h>
#include <common/compat/poll.h>
#include <common/compat/socket.h>
+#include <common/compat/endian.h>
#include <common/defaults.h>
#include <common/daemonize.h>
#include <common/futex.h>
#include <common/uri.h>
#include <common/utils.h>
+#include <common/compat/endian.h>
+
#include "fd-limit.h"
#include "jul-thread.h"
#include "lttng-sessiond.h"
#include <common/common.h>
#include <common/sessiond-comm/jul.h>
+#include <common/compat/endian.h>
+
#include "jul.h"
#include "ust-app.h"
#include "utils.h"
size = poll_max_size;
}
- ret = epoll_create1(flags);
+ ret = compat_glibc_epoll_create(size, flags);
if (ret < 0) {
/* At this point, every error is fatal */
PERROR("epoll_create1");
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifdef _COMPAT_ENDIAN_H
+#ifndef _COMPAT_ENDIAN_H
#define _COMPAT_ENDIAN_H
#ifdef __linux__
#include <endian.h>
+
+/*
+ * htobe/betoh are not defined for glibc <2.9, so add them
+ * explicitly if they are missing.
+ */
+#ifdef __USE_BSD
+/* Conversion interfaces. */
+# include <byteswap.h>
+
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# ifndef htobe16
+# define htobe16(x) __bswap_16(x)
+# endif
+# ifndef htole16
+# define htole16(x) (x)
+# endif
+# ifndef be16toh
+# define be16toh(x) __bswap_16(x)
+# endif
+# ifndef le16toh
+# define le16toh(x) (x)
+# endif
+
+# ifndef htobe32
+# define htobe32(x) __bswap_32(x)
+# endif
+# ifndef htole32
+# define htole32(x) (x)
+# endif
+# ifndef be32toh
+# define be32toh(x) __bswap_32(x)
+# endif
+# ifndef le32toh
+# define le32toh(x) (x)
+# endif
+
+# ifndef htobe64
+# define htobe64(x) __bswap_64(x)
+# endif
+# ifndef htole64
+# define htole64(x) (x)
+# endif
+# ifndef be64toh
+# define be64toh(x) __bswap_64(x)
+# endif
+# ifndef le64toh
+# define le64toh(x) (x)
+# endif
+
+# else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+# ifndef htobe16
+# define htobe16(x) (x)
+# endif
+# ifndef htole16
+# define htole16(x) __bswap_16(x)
+# endif
+# ifndef be16toh
+# define be16toh(x) (x)
+# endif
+# ifndef le16toh
+# define le16toh(x) __bswap_16(x)
+# endif
+
+# ifndef htobe32
+# define htobe32(x) (x)
+# endif
+# ifndef htole32
+# define htole32(x) __bswap_32(x)
+# endif
+# ifndef be32toh
+# define be32toh(x) (x)
+# endif
+# ifndef le32toh
+# define le32toh(x) __bswap_32(x)
+# endif
+
+# ifndef htobe64
+# define htobe64(x) (x)
+# endif
+# ifndef htole64
+# define htole64(x) __bswap_64(x)
+# endif
+# ifndef be64toh
+# define be64toh(x) (x)
+# endif
+# ifndef le64toh
+# define le64toh(x) __bswap_64(x)
+# endif
+
+# endif /* __BYTE_ORDER == __LITTLE_ENDIAN */
+#endif /* __USE_BSD */
+
#elif defined(__FreeBSD__)
#include <machine/endian.h>
#else
#ifdef HAVE_EPOLL
#include <sys/epoll.h>
#include <stdio.h>
+#include <features.h>
+#include <common/compat/fcntl.h>
/* See man epoll(7) for this define path */
#define COMPAT_EPOLL_PROC_PATH "/proc/sys/fs/epoll/max_user_watches"
LPOLLNVAL = EPOLLHUP,
LPOLLRDHUP = EPOLLRDHUP,
/* Close on exec feature of epoll */
+#if __GLIBC_PREREQ(2, 9)
LTTNG_CLOEXEC = EPOLL_CLOEXEC,
+#else
+ /*
+ * EPOLL_CLOEXEC was added in glibc 2.8 (usually used in conjunction with
+ * epoll_create1(..)), but since neither EPOLL_CLOEXEC exists nor
+ * epoll_create1(..), we set it to FD_CLOEXEC so that we can pass it
+ * directly to fcntl(..) instead.
+ */
+ LTTNG_CLOEXEC = FD_CLOEXEC,
+#endif
};
struct compat_epoll_event {
#define lttng_poll_create(events, size, flags) \
compat_epoll_create(events, size, flags)
+#if __GLIBC_PREREQ(2, 9)
+static inline int compat_glibc_epoll_create(int size __attribute__((unused)),
+ int flags)
+{
+ return epoll_create1(flags);
+}
+#else
+static inline int compat_glibc_epoll_create(int size, int flags)
+{
+ /*
+ * epoll_create1 was added in glibc 2.9, but unfortunatly reverting to
+ * epoll_create(..) also means that we lose the possibility to
+ * directly set the EPOLL_CLOEXEC, so try and do it anyway but through
+ * fcntl(..).
+ */
+ int efd = epoll_create(size);
+ assert(fcntl(efd, F_SETFD, flags) != -1);
+ return efd;
+}
+#endif
+
/*
* Wait on epoll set with the number of fd registered to the lttng_poll_event
* data structure (events).
#include <bin/lttng-consumerd/health-consumerd.h>
#include <common/common.h>
+#include <common/compat/endian.h>
#include <common/kernel-ctl/kernel-ctl.h>
#include <common/kernel-consumer/kernel-consumer.h>
#include <common/consumer-stream.h>
#include <common/common.h>
#include <common/utils.h>
#include <common/compat/poll.h>
+#include <common/compat/endian.h>
#include <common/index/index.h>
#include <common/kernel-ctl/kernel-ctl.h>
#include <common/sessiond-comm/relayd.h>
#include <common/common.h>
#include <common/defaults.h>
+#include <common/compat/endian.h>
#include <common/utils.h>
#include "index.h"
#include <common/sessiond-comm/sessiond-comm.h>
#include <common/sessiond-comm/relayd.h>
#include <common/compat/fcntl.h>
+#include <common/compat/endian.h>
#include <common/pipe.h>
#include <common/relayd/relayd.h>
#include <common/utils.h>
#include <common/common.h>
#include <common/defaults.h>
+#include <common/compat/endian.h>
#include <common/sessiond-comm/relayd.h>
#include <common/index/ctf-index.h>
#include <common/sessiond-comm/sessiond-comm.h>
#include <common/relayd/relayd.h>
#include <common/compat/fcntl.h>
+#include <common/compat/endian.h>
#include <common/consumer-metadata-cache.h>
#include <common/consumer-stream.h>
#include <common/consumer-timer.h>
#include <bin/lttng-relayd/lttng-viewer-abi.h>
#include <common/index/ctf-index.h>
+#include <common/compat/endian.h>
+
#define SESSION1 "test1"
#define RELAYD_URL "net://localhost"
#define LIVE_TIMER 2000000