* Copyright (C) 2011 EfficiOS Inc.
* Copyright (C) 2019 Yannick Lamarre <ylamarre@efficios.com>
*
- * SPDX-License-Identifier: GPL-2.0-only
+ * SPDX-License-Identifier: LGPL-2.1-only
*
*/
#define _LGPL_SOURCE
-#include <stdlib.h>
-#include <stdbool.h>
+#include "poll.hpp"
-#include <common/defaults.h>
-#include <common/error.h>
-#include <common/macros.h>
-#include <common/utils.h>
+#include <common/defaults.hpp>
+#include <common/error.hpp>
+#include <common/macros.hpp>
+#include <common/utils.hpp>
-#include "poll.h"
+#include <stdbool.h>
+#include <stdlib.h>
-#if HAVE_EPOLL
+#ifdef HAVE_EPOLL
#include <fcntl.h>
#include <limits.h>
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
/*
*
* Return 0 on success or else -1 with the current events pointer untouched.
*/
-static int resize_poll_event(struct lttng_poll_event *events,
- uint32_t new_size)
+static int resize_poll_event(struct lttng_poll_event *events, uint32_t new_size)
{
struct epoll_event *ptr;
LTTNG_ASSERT(events);
ptr = (epoll_event *) realloc(events->events, new_size * sizeof(*ptr));
- if (ptr == NULL) {
+ if (ptr == nullptr) {
PERROR("realloc epoll add");
goto error;
}
if (new_size > events->alloc_size) {
/* Zero newly allocated memory */
- memset(ptr + events->alloc_size, 0,
- (new_size - events->alloc_size) * sizeof(*ptr));
+ memset(ptr + events->alloc_size, 0, (new_size - events->alloc_size) * sizeof(*ptr));
}
events->events = ptr;
events->alloc_size = new_size;
/*
* Create epoll set and allocate returned events structure.
*/
-int compat_epoll_create(struct lttng_poll_event *events, int size, int flags)
+int compat_epoll_create(struct lttng_poll_event *events, int count, int flags)
{
int ret;
- if (events == NULL || size <= 0) {
+ if (events == nullptr || count <= 0) {
goto error;
}
}
/* Don't bust the limit here */
- if (size > poll_max_size) {
- size = poll_max_size;
+ if (count > poll_max_size) {
+ count = poll_max_size;
}
- ret = compat_glibc_epoll_create(size, flags);
+ ret = compat_glibc_epoll_create(count, flags);
if (ret < 0) {
/* At this point, every error is fatal */
PERROR("epoll_create1");
events->epfd = ret;
/* This *must* be freed by using lttng_poll_free() */
- events->events = (epoll_event *) zmalloc(size * sizeof(struct epoll_event));
- if (events->events == NULL) {
+ events->events = calloc<epoll_event>(count);
+ if (events->events == nullptr) {
PERROR("zmalloc epoll set");
goto error_close;
}
- events->alloc_size = events->init_size = size;
+ events->alloc_size = events->init_size = count;
events->nb_fd = 0;
return 0;
int ret;
struct epoll_event ev;
- if (events == NULL || events->events == NULL || fd < 0) {
+ if (events == nullptr || events->events == nullptr || fd < 0) {
ERR("Bad compat epoll add arguments");
goto error;
}
{
int ret;
- if (events == NULL || fd < 0 || events->nb_fd == 0) {
+ if (events == nullptr || fd < 0 || events->nb_fd == 0) {
goto error;
}
- ret = epoll_ctl(events->epfd, EPOLL_CTL_DEL, fd, NULL);
+ ret = epoll_ctl(events->epfd, EPOLL_CTL_DEL, fd, nullptr);
if (ret < 0) {
switch (errno) {
case ENOENT:
int ret;
struct epoll_event ev;
- if (events == NULL || fd < 0 || events->nb_fd == 0) {
+ if (events == nullptr || fd < 0 || events->nb_fd == 0) {
goto error;
}
/*
* Wait on epoll set. This is a blocking call of timeout value.
*/
-int compat_epoll_wait(struct lttng_poll_event *events, int timeout,
- bool interruptible)
+int compat_epoll_wait(struct lttng_poll_event *events, int timeout, bool interruptible)
{
int ret;
uint32_t new_size;
- if (events == NULL || events->events == NULL) {
+ if (events == nullptr || events->events == nullptr) {
ERR("Wrong arguments in compat_epoll_wait");
goto error;
}
/*
* Setup poll set maximum size.
*/
-int compat_epoll_set_max_size(void)
+int compat_epoll_set_max_size()
{
int ret, fd, retval = 0;
ssize_t size_ret;
*
* Return 0 on success or else -1 with the current events pointer untouched.
*/
-static int resize_poll_event(struct compat_poll_event_array *array,
- uint32_t new_size)
+static int resize_poll_event(struct compat_poll_event_array *array, uint32_t new_size)
{
struct pollfd *ptr;
}
if (new_size > array->alloc_size) {
/* Zero newly allocated memory */
- memset(ptr + array->alloc_size, 0,
- (new_size - array->alloc_size) * sizeof(*ptr));
+ memset(ptr + array->alloc_size, 0, (new_size - array->alloc_size) * sizeof(*ptr));
}
array->events = ptr;
array->alloc_size = new_size;
goto error;
}
}
- memcpy(wait->events, current->events,
- current->nb_fd * sizeof(*current->events));
+ memcpy(wait->events, current->events, current->nb_fd * sizeof(*current->events));
/* Update is done. */
events->need_update = 0;
wait = &events->wait;
/* This *must* be freed by using lttng_poll_free() */
- wait->events = (struct pollfd *) zmalloc(size * sizeof(struct pollfd));
+ wait->events = calloc<struct pollfd>(size);
if (wait->events == NULL) {
- PERROR("zmalloc struct pollfd");
+ PERROR("Failed to allocate wait events array during poll initialization");
goto error;
}
wait->alloc_size = wait->init_size = size;
- current->events = (struct pollfd *) zmalloc(size * sizeof(struct pollfd));
+ current->events = calloc<struct pollfd>(size);
if (current->events == NULL) {
- PERROR("zmalloc struct current pollfd");
+ PERROR("Failed to allocate current events array during poll initialization");
goto error;
}
/*
* Add fd to pollfd data structure with requested events.
*/
-int compat_poll_add(struct lttng_poll_event *events, int fd,
- uint32_t req_events)
+int compat_poll_add(struct lttng_poll_event *events, int fd, uint32_t req_events)
{
int new_size, ret, i;
struct compat_poll_event_array *current;
/*
* Modify an fd's events..
*/
-int compat_poll_mod(struct lttng_poll_event *events, int fd,
- uint32_t req_events)
+int compat_poll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events)
{
int i;
struct compat_poll_event_array *current;
- if (events == NULL || events->current.nb_fd == 0 ||
- events->current.events == NULL || fd < 0) {
+ if (events == NULL || events->current.nb_fd == 0 || events->current.events == NULL ||
+ fd < 0) {
ERR("Bad compat poll mod arguments");
goto error;
}
uint32_t new_size;
struct compat_poll_event_array *current;
- if (events == NULL || events->current.nb_fd == 0 ||
- events->current.events == NULL || fd < 0) {
+ if (events == NULL || events->current.nb_fd == 0 || events->current.events == NULL ||
+ fd < 0) {
goto error;
}
/* Resize array if needed. */
new_size = 1U << utils_get_count_order_u32(current->nb_fd);
- if (new_size != current->alloc_size && new_size >= current->init_size
- && current->nb_fd != 0) {
+ if (new_size != current->alloc_size && new_size >= current->init_size &&
+ current->nb_fd != 0) {
ret = resize_poll_event(current, new_size);
if (ret < 0) {
goto error;
/*
* Wait on poll() with timeout. Blocking call.
*/
-int compat_poll_wait(struct lttng_poll_event *events, int timeout,
- bool interruptible)
+int compat_poll_wait(struct lttng_poll_event *events, int timeout, bool interruptible)
{
int ret, active_fd_count;
size_t pos = 0, consecutive_entries = 0, non_idle_pos;
non_idle_pos = pos;
/* Look for next non-idle entry. */
- while (events->wait.events[++non_idle_pos].revents == 0);
+ while (events->wait.events[++non_idle_pos].revents == 0)
+ ;
/* Swap idle and non-idle entries. */
idle_entry = *current;