logger: extract epoll metadata to a struct 50/233850/2
authorMichal Bloch <m.bloch@samsung.com>
Thu, 7 May 2020 17:26:21 +0000 (19:26 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Tue, 26 May 2020 12:15:45 +0000 (14:15 +0200)
Change-Id: Idaedf8407fdb24260ba66f7bf39455c883a52e3c
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/logger/logger.c
src/logger/logger_internal.h
src/tests/logger.c

index b972e89..f220274 100644 (file)
@@ -235,11 +235,11 @@ int add_fd_entity(struct logger *logger, struct fd_entity *fd_entity)
        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;
 }
 
@@ -264,7 +264,7 @@ int modify_fd_entity(const struct logger *logger, struct fd_entity *fd_entity, i
                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;
        }
@@ -281,14 +281,14 @@ int modify_fd_entity(const struct logger *logger, struct fd_entity *fd_entity, i
 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;
 }
 
@@ -1765,8 +1765,8 @@ static int logger_create(struct logger_config_data *data, struct logger *l)
 {
        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;
 
@@ -1829,8 +1829,8 @@ static void logger_free(struct logger *l)
                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);
 }
 
 /**
@@ -1945,9 +1945,7 @@ static int do_logger(struct logger* server)
        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;
 
@@ -1962,9 +1960,9 @@ static int do_logger(struct logger* server)
                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;
 
@@ -1974,12 +1972,12 @@ static int do_logger(struct logger* server)
                }
 
                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;
index 9a0bbbb..ae6062b 100644 (file)
@@ -201,18 +201,24 @@ struct buf_params {
        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 {
index a020229..e6158f7 100644 (file)
@@ -629,8 +629,10 @@ int main()
        assert(ent.fd == 2);
 
        struct logger logger = {
-               .epollfd = 102,
-               .epollcnt = 0,
+               .epoll_common = {
+                       .fd = 102,
+                       .cnt = 0,
+               },
        };
 
        epoll_ctl_epfd_correct = 102;
@@ -640,11 +642,11 @@ int main()
        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;
@@ -669,11 +671,11 @@ int main()
        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;
@@ -692,12 +694,12 @@ int main()
        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;