X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fpoll.h;h=cc2aab8f8fa50abde12b95763a23d60d89efb264;hb=4eac90eb7d8428fc6c5a75d3f0e795844fb6c574;hp=d4bd87f589213fbace764f2f2d3d152551d5ab5a;hpb=f057dfc322670467e14c661d625cec0747ce8a31;p=lttng-tools.git diff --git a/src/common/compat/poll.h b/src/common/compat/poll.h index d4bd87f58..cc2aab8f8 100644 --- a/src/common/compat/poll.h +++ b/src/common/compat/poll.h @@ -1,43 +1,18 @@ /* - * Copyright (C) 2011 - David Goulet + * Copyright (C) 2011 EfficiOS Inc. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: LGPL-2.1-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _LTT_POLL_H #define _LTT_POLL_H -#include #include #include #include -/* - * Maximum number of fd we can monitor. - * - * For epoll(7), /proc/sys/fs/epoll/max_user_watches (since Linux 2.6.28) will - * be used for the maximum size of the poll set. If this interface is not - * available, according to the manpage, the max_user_watches value is 1/25 (4%) - * of the available low memory divided by the registration cost in bytes which - * is 90 bytes on a 32-bit kernel and 160 bytes on a 64-bit kernel. - * - * For poll(2), the max fds must not exceed RLIMIT_NOFILE given by - * getrlimit(2). - */ -extern unsigned int poll_max_size; - /* * Used by lttng_poll_clean to free the events structure in a lttng_poll_event. */ @@ -98,8 +73,8 @@ struct compat_epoll_event { static inline int __lttng_epoll_get_prev_fd(struct lttng_poll_event *events, int index, uint32_t nb_fd) { - assert(events); - assert(index != nb_fd); + LTTNG_ASSERT(events); + LTTNG_ASSERT(index != nb_fd); if (index == 0 || nb_fd == 0) { return -1; @@ -119,9 +94,7 @@ static inline int __lttng_epoll_get_prev_fd(struct lttng_poll_event *events, #define LTTNG_POLL_GET_PREV_FD(e, i, nb_fd) \ __lttng_epoll_get_prev_fd(LTTNG_REF(e), i, nb_fd) -/* - * Create the epoll set. No memory allocation is done here. - */ +/* Create the epoll set. */ extern int compat_epoll_create(struct lttng_poll_event *events, int size, int flags); #define lttng_poll_create(events, size, flags) \ @@ -143,7 +116,7 @@ static inline int compat_glibc_epoll_create(int size, int flags) * fcntl(..). */ int efd = epoll_create(size); - assert(fcntl(efd, F_SETFD, flags) != -1); + LTTNG_ASSERT(fcntl(efd, F_SETFD, flags) != -1); return efd; } #endif @@ -152,9 +125,12 @@ static inline int compat_glibc_epoll_create(int size, int flags) * Wait on epoll set with the number of fd registered to the lttng_poll_event * data structure (events). */ -extern int compat_epoll_wait(struct lttng_poll_event *events, int timeout); +extern int compat_epoll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible); #define lttng_poll_wait(events, timeout) \ - compat_epoll_wait(events, timeout) + compat_epoll_wait(events, timeout, false) +#define lttng_poll_wait_interruptible(events, timeout) \ + compat_epoll_wait(events, timeout, true) /* * Add a fd to the epoll set and resize the epoll_event structure if needed. @@ -177,7 +153,7 @@ extern int compat_epoll_del(struct lttng_poll_event *events, int fd); extern int compat_epoll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events); #define lttng_poll_mod(events, fd, req_events) \ - compat_epoll_add(events, fd, req_events) + compat_epoll_mod(events, fd, req_events) /* * Set up the poll set limits variable poll_max_size @@ -259,7 +235,7 @@ enum { LPOLLRDBAND = POLLRDBAND, LPOLLWRNORM = POLLWRNORM, LPOLLWRBAND = POLLWRBAND, -#if __linux__ +#ifdef __linux__ LPOLLMSG = POLLMSG, LPOLLRDHUP = POLLRDHUP, #elif (defined(__FreeBSD__) || defined(__CYGWIN__) || defined(__sun__) || defined(__APPLE__)) @@ -302,8 +278,8 @@ struct compat_poll_event { static inline int __lttng_poll_get_prev_fd(struct lttng_poll_event *events, int index, uint32_t nb_fd) { - assert(events); - assert(index != nb_fd); + LTTNG_ASSERT(events); + LTTNG_ASSERT(index != nb_fd); if (index == 0 || nb_fd == 0) { return -1; @@ -315,10 +291,12 @@ static inline int __lttng_poll_get_prev_fd(struct lttng_poll_event *events, /* * For the following calls, consider 'e' to be a lttng_poll_event pointer and i * being the index of the events array. + * LTTNG_POLL_GETNB is always used after lttng_poll_wait, thus we can use the + * current list for test compatibility purposes. */ #define LTTNG_POLL_GETFD(e, i) LTTNG_REF(e)->wait.events[i].fd #define LTTNG_POLL_GETEV(e, i) LTTNG_REF(e)->wait.events[i].revents -#define LTTNG_POLL_GETNB(e) LTTNG_REF(e)->wait.nb_fd +#define LTTNG_POLL_GETNB(e) LTTNG_REF(e)->current.nb_fd #define LTTNG_POLL_GETSZ(e) LTTNG_REF(e)->wait.events_size #define LTTNG_POLL_GET_PREV_FD(e, i, nb_fd) \ __lttng_poll_get_prev_fd(LTTNG_REF(e), i, nb_fd) @@ -334,9 +312,12 @@ extern int compat_poll_create(struct lttng_poll_event *events, int size); * Wait on poll(2) event with nb_fd registered to the lttng_poll_event data * structure. */ -extern int compat_poll_wait(struct lttng_poll_event *events, int timeout); +extern int compat_poll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible); #define lttng_poll_wait(events, timeout) \ - compat_poll_wait(events, timeout) + compat_poll_wait(events, timeout, false) +#define lttng_poll_wait_interruptible(events, timeout) \ + compat_poll_wait(events, timeout, true) /* * Add the fd to the pollfd structure. Resize if needed. @@ -356,12 +337,12 @@ extern int compat_poll_del(struct lttng_poll_event *events, int fd); compat_poll_del(events, fd) /* - * Modify an fd's events in the epoll set. + * Modify an fd's events in the poll set. */ extern int compat_poll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events); #define lttng_poll_mod(events, fd, req_events) \ - compat_poll_add(events, fd, req_events) + compat_poll_mod(events, fd, req_events) /* * Set up the poll set limits variable poll_max_size @@ -373,7 +354,8 @@ extern int compat_poll_set_max_size(void); /* * No need to reset a pollfd structure for poll(2) */ -static inline void lttng_poll_reset(struct lttng_poll_event *events) +static inline void lttng_poll_reset( + struct lttng_poll_event *events __attribute__((unused))) {} /*