Cleanup: Replace all perror() uses by the PERROR macro
[lttng-tools.git] / src / common / compat / compat-poll.c
index bc79eed0aaa5321c48fcd055858698bcdc5fa375..6d34a0e69cbba04d133430d11fbce0626612bad0 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <stdlib.h>
 #include <sys/resource.h>
@@ -23,6 +24,8 @@
 
 #include <common/defaults.h>
 #include <common/error.h>
+#include <common/macros.h>
+#include <common/utils.h>
 
 #include "poll.h"
 
@@ -50,6 +53,11 @@ static int resize_poll_event(struct compat_poll_event_array *array,
                PERROR("realloc epoll add");
                goto error;
        }
+       if (new_size > array->alloc_size) {
+               /* Zero newly allocated memory */
+               memset(ptr + array->alloc_size, 0,
+                       (new_size - array->alloc_size) * sizeof(*ptr));
+       }
        array->events = ptr;
        array->alloc_size = new_size;
 
@@ -119,7 +127,7 @@ int compat_poll_create(struct lttng_poll_event *events, int size)
        /* This *must* be freed by using lttng_poll_free() */
        wait->events = zmalloc(size * sizeof(struct pollfd));
        if (wait->events == NULL) {
-               perror("zmalloc struct pollfd");
+               PERROR("zmalloc struct pollfd");
                goto error;
        }
 
@@ -127,7 +135,7 @@ int compat_poll_create(struct lttng_poll_event *events, int size)
 
        current->events = zmalloc(size * sizeof(struct pollfd));
        if (current->events == NULL) {
-               perror("zmalloc struct current pollfd");
+               PERROR("zmalloc struct current pollfd");
                goto error;
        }
 
@@ -168,7 +176,9 @@ int compat_poll_add(struct lttng_poll_event *events, int fd,
        /* Check for a needed resize of the array. */
        if (current->nb_fd > current->alloc_size) {
                /* Expand it by a power of two of the current size. */
-               new_size = current->alloc_size << 1UL;
+               new_size = max_t(int,
+                               1U << utils_get_count_order_u32(current->nb_fd),
+                               current->alloc_size << 1UL);
                ret = resize_poll_event(current, new_size);
                if (ret < 0) {
                        goto error;
@@ -212,7 +222,9 @@ int compat_poll_del(struct lttng_poll_event *events, int fd)
                 * Shrink if nb_fd multiplied by two is <= than the actual size and we
                 * are above the initial size.
                 */
-               new_size = current->alloc_size >> 1UL;
+               new_size = max_t(int,
+                               utils_get_count_order_u32(current->nb_fd) >> 1U,
+                               current->alloc_size >> 1U);
                ret = resize_poll_event(current, new_size);
                if (ret < 0) {
                        goto error;
@@ -267,7 +279,7 @@ int compat_poll_wait(struct lttng_poll_event *events, int timeout)
        ret = poll(events->wait.events, events->wait.nb_fd, timeout);
        if (ret < 0) {
                /* At this point, every error is fatal */
-               perror("poll wait");
+               PERROR("poll wait");
                goto error;
        }
 
@@ -294,7 +306,7 @@ void compat_poll_set_max_size(void)
 
        ret = getrlimit(RLIMIT_NOFILE, &lim);
        if (ret < 0) {
-               perror("getrlimit poll RLIMIT_NOFILE");
+               PERROR("getrlimit poll RLIMIT_NOFILE");
                return;
        }
 
This page took 0.024411 seconds and 4 git commands to generate.