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;
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.)
{
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;
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);
}
/**
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);
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);