X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fpoll.h;h=2cfad9a25fa1c7e0339ff8e810796c58f1b5b552;hp=7af2ef050bdbf9339b0aa2243ea30ab2f2c18ddb;hb=d21b0d71990ac6ec4272c1f80f0ca544103628b3;hpb=76d7553fcee76da7c103c3b51a6b01f46cd784c8 diff --git a/src/common/compat/poll.h b/src/common/compat/poll.h index 7af2ef050..2cfad9a25 100644 --- a/src/common/compat/poll.h +++ b/src/common/compat/poll.h @@ -1,18 +1,18 @@ /* * Copyright (C) 2011 - David Goulet * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; only version 2 of the License. + * 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. * * 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., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307, USA. + * 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 @@ -42,7 +42,9 @@ extern unsigned int poll_max_size; */ static inline void __lttng_poll_free(void *events) { - free(events); + if (events) { + free(events); + } } /* @@ -76,7 +78,8 @@ enum { struct compat_epoll_event { int epfd; uint32_t nb_fd; /* Current number of fd in events */ - uint32_t events_size; /* Size of events array */ + uint32_t alloc_size; /* Size of events array */ + uint32_t init_size; /* Initial size of events array */ struct epoll_event *events; }; #define lttng_poll_event compat_epoll_event @@ -185,29 +188,55 @@ enum { LPOLLRDBAND = POLLRDBAND, LPOLLWRNORM = POLLWRNORM, LPOLLWRBAND = POLLWRBAND, +#if __linux__ LPOLLMSG = POLLMSG, + LPOLLRDHUP = POLLRDHUP, +#elif (defined(__FreeBSD__) || defined(__CYGWIN__)) + LPOLLMSG = 0, + LPOLLRDHUP = 0, +#else +#error "Please add support for your OS." +#endif /* __linux__ */ LPOLLERR = POLLERR, LPOLLHUP = POLLHUP | POLLNVAL, - LPOLLRDHUP = POLLRDHUP, /* Close on exec feature does not exist for poll(2) */ LTTNG_CLOEXEC = 0xdead, }; -struct compat_poll_event { +struct compat_poll_event_array { uint32_t nb_fd; /* Current number of fd in events */ - uint32_t events_size; /* Size of events array */ + uint32_t alloc_size; /* Size of events array */ + /* Initial size of the pollset. We never shrink below that. */ + uint32_t init_size; struct pollfd *events; }; + +struct compat_poll_event { + /* + * Modified by the wait action. Updated using current fields if the + * need_update flag is set. + */ + struct compat_poll_event_array wait; + /* + * This is modified by add/del actions being the _current_ flow of + * 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; +}; #define lttng_poll_event compat_poll_event /* * For the following calls, consider 'e' to be a lttng_poll_event pointer and i * being the index of the events array. */ -#define LTTNG_POLL_GETFD(e, i) LTTNG_REF(e)->events[i].fd -#define LTTNG_POLL_GETEV(e, i) LTTNG_REF(e)->events[i].revents -#define LTTNG_POLL_GETNB(e) LTTNG_REF(e)->nb_fd -#define LTTNG_POLL_GETSZ(e) LTTNG_REF(e)->events_size +#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_GETSZ(e) LTTNG_REF(e)->wait.events_size /* * Create a pollfd structure of size 'size'. @@ -261,7 +290,8 @@ static inline void lttng_poll_reset(struct lttng_poll_event *events) static inline void lttng_poll_clean(struct lttng_poll_event *events) { if (events) { - __lttng_poll_free((void *) events->events); + __lttng_poll_free((void *) events->wait.events); + __lttng_poll_free((void *) events->current.events); } }