From 30699819cb2c416ca7c8db346df20f8ed5ac728f Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Thu, 7 May 2020 21:16:47 +0200 Subject: [PATCH] logger: bind epoll meta lifetime to logger Change-Id: Ifddd234c30f215ac501faff550a24cea60838f07 Signed-off-by: Michal Bloch --- src/logger/logger.c | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/logger/logger.c b/src/logger/logger.c index d68bd5d..988ba1d 100644 --- a/src/logger/logger.c +++ b/src/logger/logger.c @@ -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); -- 2.7.4