logger: bind epoll meta lifetime to logger 52/233852/2
authorMichal Bloch <m.bloch@samsung.com>
Thu, 7 May 2020 19:16:47 +0000 (21:16 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Tue, 26 May 2020 12:15:45 +0000 (14:15 +0200)
Change-Id: Ifddd234c30f215ac501faff550a24cea60838f07
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/logger/logger.c

index d68bd5d..988ba1d 100644 (file)
@@ -44,6 +44,7 @@ static void dispatch_event_reader_source(struct logger *server, struct epoll_eve
 void reader_free(struct reader* reader);
 static void logger_free(struct logger* l);
 int socket_initialize(struct sock_data *sock, struct log_buffer *buffer, service_socket_t service_socket, struct socket_config_data *data);
+static int initialize_epoll_size(struct epoll_event **events, unsigned *size);
 
 /** global state when logger is not interrupted by any handled signals */
 static volatile sig_atomic_t g_logger_run = 1;
@@ -1754,6 +1755,31 @@ static void logger_add_writer(struct logger* l, struct writer* wr)
        add_fd_entity(l, &wr->fd_entity);
 }
 
+int epoll_metadata_initialize(struct epoll_metadata *metadata)
+{
+       metadata->fd = epoll_create1(0);
+       if (metadata->fd < 0)
+               return -errno;
+
+       int r = initialize_epoll_size(&metadata->events, &metadata->events_size);
+       if (r < 0) {
+               close(metadata->fd);
+               metadata->fd = -1;
+               return r;
+       }
+
+       metadata->cnt = 0;
+       return 0;
+}
+
+void epoll_metadata_destroy(struct epoll_metadata *metadata)
+{
+       if (metadata->fd >= 0)
+               close(metadata->fd);
+
+       free(metadata->events);
+}
+
 /**
  * @brief Create the logger server
  * @details Allocate the logger server's auxiliary structures (buffers etc.)
@@ -1765,9 +1791,9 @@ static int logger_create(struct logger_config_data *data, struct logger *l)
 {
        memset(l, 0, sizeof *l);
 
-       l->epoll_common.fd = epoll_create1(0);
-       if (l->epoll_common.fd == -1)
-               return -errno;
+       int r = epoll_metadata_initialize(&l->epoll_common);
+       if (r < 0)
+               return r;
        l->epolltime = data->epoll_time;
 
        l->lazy_polling_total = data->lazy_polling_total;
@@ -1829,8 +1855,7 @@ static void logger_free(struct logger *l)
                if (l->buffers[j])
                        buffer_free(l->buffers[j], l);
 
-       if (l->epoll_common.fd >= 0)
-               close(l->epoll_common.fd);
+       epoll_metadata_destroy(&l->epoll_common);
 }
 
 /**
@@ -1959,10 +1984,6 @@ static int do_logger(struct logger* server)
        for (unsigned u = 0; u < NELEMS(handled_signals); ++u)
                sigaction(handled_signals[u], &action, NULL);
 
-       int r = initialize_epoll_size(&server->epoll_common.events, &server->epoll_common.events_size);
-       if (r < 0)
-               return r;
-
        bool use_lazy_polling = true;
        while (g_logger_run) {
                clock_gettime(CLOCK_MONOTONIC, &server->now);
@@ -1974,15 +1995,13 @@ static int do_logger(struct logger* server)
                if (use_lazy_polling)
                        usleep(MS_TO_US * server->lazy_polling_sleep);
 
-               r = handle_epoll_events(server, &server->epoll_common, server->epolltime * !use_lazy_polling);
+               int r = handle_epoll_events(server, &server->epoll_common, server->epolltime * !use_lazy_polling);
                if (r < 0)
                        break;
 
                service_all_readers(server);
        }
 
-       free(server->epoll_common.events);
-
        /* ensure all logs are written no matter when the program was interrupted */
        server->exiting = 1;
        service_all_readers(server);