#ifndef _LTT_POLL_H
#define _LTT_POLL_H
+#include <assert.h>
#include <string.h>
#include <unistd.h>
*/
static inline void __lttng_poll_free(void *events)
{
- if (events) {
- free(events);
- }
+ free(events);
}
/*
};
#define lttng_poll_event 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);
+
+ if (index == 0 || nb_fd == 0) {
+ return -1;
+ } else {
+ return events->events[index - 1].data.fd;
+ }
+}
+
/*
* 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_GETEV(e, i) LTTNG_REF(e)->events[i].events
#define LTTNG_POLL_GETNB(e) LTTNG_REF(e)->nb_fd
#define LTTNG_POLL_GETSZ(e) LTTNG_REF(e)->events_size
+#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.
}
}
+/*
+ * Initialize an already allocated poll event data structure. For epoll(), the
+ * epfd is set to -1 to indicate that it's not usable.
+ */
+static inline void lttng_poll_init(struct lttng_poll_event *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;
+}
+
/*
* Clean the events structure of a lttng_poll_event. It's the caller
* responsability to free the lttng_poll_event memory.
{
int ret;
- if (events) {
+ if (!events) {
+ return;
+ }
+
+ if (events->epfd >= 0) {
ret = close(events->epfd);
if (ret) {
perror("close");
}
- __lttng_poll_free((void *) events->events);
}
+
+ __lttng_poll_free((void *) events->events);
}
#else /* HAVE_EPOLL */
};
#define lttng_poll_event 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);
+
+ if (index == 0 || nb_fd == 0) {
+ return -1;
+ } else {
+ return events->current.events[index - 1].fd;
+ }
+}
+
/*
* 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_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
+#define LTTNG_POLL_GET_PREV_FD(e, i, nb_fd) \
+ __lttng_poll_get_prev_fd(LTTNG_REF(e), i, nb_fd)
/*
* Create a pollfd structure of size 'size'.
static inline void lttng_poll_reset(struct lttng_poll_event *events)
{}
+/*
+ * Initialize an already allocated poll event data structure.
+ */
+static inline void lttng_poll_init(struct lttng_poll_event *events)
+{
+ memset(events, 0, sizeof(struct lttng_poll_event));
+}
+
/*
* Clean the events structure of a lttng_poll_event. It's the caller
* responsability to free the lttng_poll_event memory.