#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).
/*
* Set up the poll set limits variable poll_max_size
*/
-extern void compat_epoll_set_max_size(void);
+extern int compat_epoll_set_max_size(void);
#define lttng_poll_set_max_size() \
compat_epoll_set_max_size()
*/
static inline void lttng_poll_init(struct lttng_poll_event *events)
{
- lttng_poll_reset(events);
+ memset(events, 0, sizeof(struct lttng_poll_event));
/* Set fd to -1 so if clean before created, we don't close 0. */
events->epfd = -1;
}
if (events->epfd >= 0) {
ret = close(events->epfd);
if (ret) {
- perror("close");
+ PERROR("close");
}
}
#if __linux__
LPOLLMSG = POLLMSG,
LPOLLRDHUP = POLLRDHUP,
-#elif (defined(__FreeBSD__) || defined(__CYGWIN__))
+#elif (defined(__FreeBSD__) || defined(__CYGWIN__) || defined(__sun__))
LPOLLMSG = 0,
LPOLLRDHUP = 0,
#else
* execution before a poll wait is done.
*/
struct compat_poll_event_array current;
- /* Indicate if wait.events needs to be realloc. */
- int need_realloc:1;
+
/* Indicate if wait.events need to be updated from current. */
int need_update:1;
};
/*
* Set up the poll set limits variable poll_max_size
*/
-extern void compat_poll_set_max_size(void);
+extern int compat_poll_set_max_size(void);
#define lttng_poll_set_max_size() \
compat_poll_set_max_size()