#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/wait.h>
+#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>
struct logger {
int epollfd;
+ unsigned epollcnt;
list_head writers;
list_head extra_readers;
struct log_buffer* buffers[LOG_ID_MAX];
{
assert(logger);
assert(fd_entity);
- return epoll_ctl(logger->epollfd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event) < 0 ? -errno : 0;
+
+ int r = epoll_ctl(logger->epollfd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
+ if (r < 0)
+ return -errno;
+
+ ++logger->epollcnt;
+ return 0;
}
/**
static inline int remove_fd_entity(struct logger *logger, struct fd_entity *fd_entity)
{
assert(logger);
+ assert(logger->epollcnt > 0);
assert(fd_entity);
- return epoll_ctl(logger->epollfd, EPOLL_CTL_DEL, fd_entity->fd, NULL) < 0 ? -errno : 0;
+
+ int r = epoll_ctl(logger->epollfd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
+ if (r < 0)
+ return -errno;
+
+ --logger->epollcnt;
+ return 0;
}
/**
g_logger_run = 0;
}
+static void ensure_epoll_size(struct epoll_event **events, unsigned *size, unsigned wanted_size)
+{
+ assert(events);
+ assert(size);
+
+ if (wanted_size <= *size)
+ return;
+
+ typeof(*events) temp = realloc(*events, wanted_size * sizeof **events);
+ if (!temp)
+ return;
+
+ *events = temp;
+ *size = wanted_size;
+}
+
+static int initialize_epoll_size(struct epoll_event **events, unsigned *size)
+{
+ assert(events);
+ assert(size);
+
+ *size = 16U;
+ *events = malloc(*size * sizeof **events);
+ return !*events ? -ENOMEM : 0;
+}
+
/**
* @brief Do logging
* @details The main logging loop
*/
static int do_logger(struct logger* server)
{
- struct epoll_event events[1024];
-
struct sigaction action = {
.sa_handler = handle_signals,
.sa_flags = 0
for (unsigned u = 0; u < NELEMS(handled_signals); ++u)
sigaction(handled_signals[u], &action, NULL);
+ unsigned events_size;
+ struct epoll_event *events;
+ int r = initialize_epoll_size(&events, &events_size);
+ if (r < 0)
+ return r;
while (g_logger_run) {
- int nfds = epoll_wait(server->epollfd, events, NELEMS(events), 1000);
+ ensure_epoll_size(&events, &events_size, server->epollcnt);
+
+ int nfds = epoll_wait(server->epollfd, events, events_size, 1000);
if (nfds < 0 && errno == EINTR)
continue;