assert(logger);
assert(fd_entity);
- int r = epoll_ctl(logger->epollfd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
+ int r = epoll_ctl(logger->epoll_common.fd, EPOLL_CTL_ADD, fd_entity->fd, &fd_entity->event);
if (r < 0)
return -errno;
- ++logger->epollcnt;
+ ++logger->epoll_common.cnt;
return 0;
}
return 0;
fd_entity->event.events = wanted_mask;
- if (epoll_ctl(logger->epollfd, EPOLL_CTL_MOD, fd_entity->fd, &fd_entity->event) < 0) {
+ if (epoll_ctl(logger->epoll_common.fd, EPOLL_CTL_MOD, fd_entity->fd, &fd_entity->event) < 0) {
fd_entity->event.events = pre;
return -errno;
}
int remove_fd_entity(struct logger *logger, struct fd_entity *fd_entity)
{
assert(logger);
- assert(logger->epollcnt > 0);
+ assert(logger->epoll_common.cnt > 0);
assert(fd_entity);
- int r = epoll_ctl(logger->epollfd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
+ int r = epoll_ctl(logger->epoll_common.fd, EPOLL_CTL_DEL, fd_entity->fd, NULL);
if (r < 0)
return -errno;
- --logger->epollcnt;
+ --logger->epoll_common.cnt;
return 0;
}
{
memset(l, 0, sizeof *l);
- l->epollfd = epoll_create1(0);
- if (l->epollfd == -1)
+ l->epoll_common.fd = epoll_create1(0);
+ if (l->epoll_common.fd == -1)
return -errno;
l->epolltime = data->epoll_time;
if (l->buffers[j])
buffer_free(l->buffers[j], l);
- if (l->epollfd >= 0)
- close(l->epollfd);
+ if (l->epoll_common.fd >= 0)
+ close(l->epoll_common.fd);
}
/**
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);
+ int r = initialize_epoll_size(&server->epoll_common.events, &server->epoll_common.events_size);
if (r < 0)
return r;
if (use_lazy_polling)
usleep(MS_TO_US * server->lazy_polling_sleep);
- ensure_epoll_size(&events, &events_size, server->epollcnt);
+ ensure_epoll_size(&server->epoll_common.events, &server->epoll_common.events_size, server->epoll_common.cnt);
- int nfds = epoll_wait(server->epollfd, events, events_size, server->epolltime * !use_lazy_polling);
+ int nfds = epoll_wait(server->epoll_common.fd, server->epoll_common.events, server->epoll_common.events_size, server->epolltime * !use_lazy_polling);
if (nfds < 0 && errno == EINTR) // TODO: This is *almost* TEMP_FAILURE_RETRY. Is it equivalent?
continue;
}
for (int i = 0; i < nfds; i++)
- dispatch_epoll_event(server, events + i);
+ dispatch_epoll_event(server, server->epoll_common.events + i);
service_all_readers(server);
}
- free(events);
+ free(server->epoll_common.events);
/* ensure all logs are written no matter when the program was interrupted */
server->exiting = 1;
int time;
};
+struct epoll_metadata {
+ int fd;
+ unsigned cnt;
+ unsigned events_size;
+ struct epoll_event *events;
+};
+
struct logger {
- int epollfd;
- unsigned epollcnt;
- int epolltime;
- int lazy_polling_total;
- int lazy_polling_sleep;
- list_head writers;
- list_head extra_readers;
- struct log_buffer* buffers[LOG_ID_MAX];
- struct buf_params buf_params;
- int exiting;
- struct timespec now;
+ struct epoll_metadata epoll_common;
+ int epolltime;
+ int lazy_polling_total;
+ int lazy_polling_sleep;
+ list_head writers;
+ list_head extra_readers;
+ struct log_buffer* buffers[LOG_ID_MAX];
+ struct buf_params buf_params;
+ int exiting;
+ struct timespec now;
};
struct socket_config_data {
assert(ent.fd == 2);
struct logger logger = {
- .epollfd = 102,
- .epollcnt = 0,
+ .epoll_common = {
+ .fd = 102,
+ .cnt = 0,
+ },
};
epoll_ctl_epfd_correct = 102;
epoll_ctl_data_correct = (void *)0xDA7A;
epoll_ctl_errno = ELOOP;
assert(add_fd_entity(&logger, &ent) == -ELOOP);
- assert(logger.epollcnt == 0);
+ assert(logger.epoll_common.cnt == 0);
epoll_ctl_errno = 0;
assert(add_fd_entity(&logger, &ent) == 0);
- assert(logger.epollcnt == 1);
+ assert(logger.epoll_common.cnt == 1);
// TODO: I have no idea why this is checked here, but let's roll with it.
ent.fd = -1;
epoll_ctl_op_correct = EPOLL_CTL_DEL;
epoll_ctl_errno = EPERM;
assert(remove_fd_entity(&logger, &ent) == -EPERM);
- assert(logger.epollcnt == 1);
+ assert(logger.epoll_common.cnt == 1);
epoll_ctl_errno = 0;
assert(remove_fd_entity(&logger, &ent) == 0);
- assert(logger.epollcnt == 0);
+ assert(logger.epoll_common.cnt == 0);
struct writer *writer;
calloc_fail = true;
assert(writer->service_socket == (service_socket_t)18);
assert(!closed[2]);
- logger.epollcnt = 1;
+ logger.epoll_common.cnt = 1;
epoll_ctl_op_correct = EPOLL_CTL_DEL;
epoll_ctl_fd_correct = 3;
writer_close_fd(&logger, writer);
assert(closed[2]);
- assert(logger.epollcnt == 0);
+ assert(logger.epoll_common.cnt == 0);
// TODO: Check if epoll_ctl called
open_errno = ENOENT;