From: Michael Tremer Date: Wed, 3 Feb 2021 23:14:52 +0000 (+0000) Subject: Move creation of epoll() and timerfd() to main X-Git-Tag: 0.1.0~13 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=6de1dc5ccf96545253ac36b0fff45223b7af5cb5;p=fireperf.git Move creation of epoll() and timerfd() to main This is shared code between the client and the server and it is easier to just maintain it once. Signed-off-by: Michael Tremer --- diff --git a/src/client.c b/src/client.c index 7a848d7..9c35faa 100644 --- a/src/client.c +++ b/src/client.c @@ -210,7 +210,7 @@ static int send_data_to_server(struct fireperf_config* conf, int fd, return 0; } -int fireperf_client(struct fireperf_config* conf) { +int fireperf_client(struct fireperf_config* conf, int epollfd, int timerfd) { struct fireperf_client_stats stats = { 0 }; struct fireperf_random_pool* pool = NULL; @@ -227,19 +227,11 @@ int fireperf_client(struct fireperf_config* conf) { int r = 1; - int epollfd = -1; - struct epoll_event ev; + struct epoll_event ev = { + .events = EPOLLIN, + }; struct epoll_event events[EPOLL_MAX_EVENTS]; - // Initialize epoll() - epollfd = epoll_create1(0); - if (epollfd < 0) { - ERROR(conf, "Could not initialize epoll(): %s\n", strerror(errno)); - return 1; - } - - ev.events = EPOLLIN; - // Let us know when the socket is ready for sending data if (!conf->keepalive_only) ev.events |= EPOLLOUT; diff --git a/src/client.h b/src/client.h index b1d83e5..a9c6f70 100644 --- a/src/client.h +++ b/src/client.h @@ -23,6 +23,6 @@ #include "main.h" -int fireperf_client(struct fireperf_config* conf); +int fireperf_client(struct fireperf_config* conf, int epollfd, int timerfd); #endif /* FIREPERF_CLIENT_H */ diff --git a/src/main.c b/src/main.c index 531f117..5aeeae8 100644 --- a/src/main.c +++ b/src/main.c @@ -25,9 +25,12 @@ #include #include #include -#include +#include #include +#include +#include #include +#include #include "client.h" #include "main.h" @@ -257,12 +260,52 @@ int main(int argc, char* argv[]) { if (r) return r; + // Initialize epoll() + int epollfd = epoll_create1(0); + if (epollfd < 0) { + ERROR(&conf, "Could not initialize epoll(): %s\n", strerror(errno)); + r = 1; + goto ERROR; + } + + // Create timerfd() to print statistics + int timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC); + if (timerfd < 0) { + ERROR(&conf, "timerfd_create() failed: %s\n", strerror(errno)); + r = 1; + goto ERROR; + } + + struct epoll_event ev = { + .events = EPOLLIN, + .data.fd = timerfd, + }; + + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, timerfd, &ev)) { + ERROR(&conf, "Could not add timerfd to epoll(): %s\n", strerror(errno)); + r = 1; + goto ERROR; + } + + // Let the timer ping us once a second + struct itimerspec timer = { + .it_interval.tv_sec = 1, + .it_value.tv_sec = 1, + }; + + r = timerfd_settime(timerfd, 0, &timer, NULL); + if (r) { + ERROR(&conf, "Could not set timer: %s\n", strerror(errno)); + r = 1; + goto ERROR; + } + switch (conf.mode) { case FIREPERF_MODE_CLIENT: - return fireperf_client(&conf); + return fireperf_client(&conf, epollfd, timerfd); case FIREPERF_MODE_SERVER: - return fireperf_server(&conf); + return fireperf_server(&conf, epollfd, timerfd); case FIREPERF_MODE_NONE: fprintf(stderr, "No mode selected\n"); @@ -270,5 +313,12 @@ int main(int argc, char* argv[]) { break; } +ERROR: + if (epollfd > 0) + close(epollfd); + + if (timerfd > 0) + close(timerfd); + return r; } diff --git a/src/server.c b/src/server.c index e481cb3..b119c80 100644 --- a/src/server.c +++ b/src/server.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -269,24 +268,16 @@ static int is_listening_socket(struct fireperf_config* conf, int* sockets, int f return 0; } -int fireperf_server(struct fireperf_config* conf) { +int fireperf_server(struct fireperf_config* conf, int epollfd, int timerfd) { struct fireperf_server_stats stats = { 0 }; DEBUG(conf, "Launching " PACKAGE_NAME " in server mode\n"); int listening_sockets[conf->listening_sockets]; - int epollfd = -1; - struct epoll_event events[EPOLL_MAX_EVENTS]; - int r = 1; - - // Initialize epoll() - epollfd = epoll_create1(0); - if (epollfd < 0) { - ERROR(conf, "Could not initialize epoll(): %s\n", strerror(errno)); - return 1; - } + struct epoll_event ev; + struct epoll_event events[EPOLL_MAX_EVENTS]; // Create listening sockets for (unsigned int i = 0; i < conf->listening_sockets; i++) { @@ -297,10 +288,8 @@ int fireperf_server(struct fireperf_config* conf) { listening_sockets[i] = sockfd; // Add listening socket to epoll - struct epoll_event ev = { - .events = EPOLLIN, - .data.fd = sockfd, - }; + ev.events = EPOLLIN; + ev.data.fd = sockfd; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &ev)) { ERROR(conf, "Could not add socket file descriptor to epoll(): %s\n", @@ -309,36 +298,6 @@ int fireperf_server(struct fireperf_config* conf) { } } - // Create timerfd() to print statistics - int timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC); - if (timerfd < 0) { - ERROR(conf, "timerfd_create() failed: %s\n", strerror(errno)); - goto ERROR; - } - - struct epoll_event ev = { - .events = EPOLLIN, - .data.fd = timerfd, - }; - - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, timerfd, &ev)) { - ERROR(conf, "Could not add timerfd to epoll(): %s\n", - strerror(errno)); - goto ERROR; - } - - // Let the timer ping us once a second - struct itimerspec timer = { - .it_interval.tv_sec = 1, - .it_value.tv_sec = 1, - }; - - r = timerfd_settime(timerfd, 0, &timer, NULL); - if (r) { - ERROR(conf, "Could not set timer: %s\n", strerror(errno)); - return 1; - } - DEBUG(conf, "Entering main loop...\n"); while (!conf->terminated) { @@ -426,11 +385,5 @@ ERROR: close(listening_sockets[i]); } - if (epollfd > 0) - close(epollfd); - - if (timerfd > 0) - close(timerfd); - return r; } diff --git a/src/server.h b/src/server.h index 9dc4a00..b6984c0 100644 --- a/src/server.h +++ b/src/server.h @@ -23,6 +23,6 @@ #include "main.h" -int fireperf_server(struct fireperf_config* conf); +int fireperf_server(struct fireperf_config* conf, int epollfd, int timerfd); #endif /* FIREPERF_SERVER_H */