X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fpoll.h;h=f892c832333eb10bdfcc4cf64d66918c17d3ab02;hp=8403880cf3742c61f4c01e281a69f2f5ff9084db;hb=f263b7fd113e51d0737554e8232b8669e142a260;hpb=6d737ce48af40e77ca27cb78348e7f3042eab3ed diff --git a/src/common/compat/poll.h b/src/common/compat/poll.h index 8403880cf..f892c8323 100644 --- a/src/common/compat/poll.h +++ b/src/common/compat/poll.h @@ -52,6 +52,8 @@ static inline void __lttng_poll_free(void *events) #ifdef HAVE_EPOLL #include #include +#include +#include /* See man epoll(7) for this define path */ #define COMPAT_EPOLL_PROC_PATH "/proc/sys/fs/epoll/max_user_watches" @@ -71,7 +73,17 @@ enum { 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 { @@ -115,6 +127,27 @@ extern int compat_epoll_create(struct lttng_poll_event *events, #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). @@ -164,7 +197,7 @@ static inline void lttng_poll_reset(struct lttng_poll_event *events) */ 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; }