From d95f18fa39e6ece48a3fe6dc45c5030f4e0827db Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 9 Jul 2022 23:23:50 +0200 Subject: [PATCH] MAJOR: pollers: rely on fd_reregister_all() at boot time The poller-specific thread init code now uses that new function to safely register boot events. This ensures that we don't register an event for another group and that we properly deal with parallel thread startup. It's only done for thread-aware pollers, there's no point in using that in poll/select though that should work as well. --- src/ev_epoll.c | 5 +---- src/ev_evports.c | 5 +---- src/ev_kqueue.c | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 77ac0c067..7be659bc1 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -250,8 +250,6 @@ static void _do_poll(struct poller *p, int exp, int wake) static int init_epoll_per_thread() { - int fd; - epoll_events = calloc(1, sizeof(struct epoll_event) * global.tune.maxpollevents); if (epoll_events == NULL) goto fail_alloc; @@ -267,8 +265,7 @@ static int init_epoll_per_thread() * fd for this thread. Let's just mark them as updated, the poller will * do the rest. */ - for (fd = 0; fd < global.maxsock; fd++) - updt_fd_polling(fd); + fd_reregister_all(tgid, ti->ltid_bit); return 1; fail_fd: diff --git a/src/ev_evports.c b/src/ev_evports.c index 06e7a01c6..79854702a 100644 --- a/src/ev_evports.c +++ b/src/ev_evports.c @@ -279,8 +279,6 @@ static void _do_poll(struct poller *p, int exp, int wake) static int init_evports_per_thread() { - int fd; - evports_evlist_max = global.tune.maxpollevents; evports_evlist = calloc(evports_evlist_max, sizeof(*evports_evlist)); if (evports_evlist == NULL) { @@ -298,8 +296,7 @@ static int init_evports_per_thread() * fd for this thread. Let's just mark them as updated, the poller will * do the rest. */ - for (fd = 0; fd < global.maxsock; fd++) - updt_fd_polling(fd); + fd_reregister_all(tgid, ti->ltid_bit); return 1; diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index c37d99b1a..53bda1fe2 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -205,8 +205,6 @@ static void _do_poll(struct poller *p, int exp, int wake) static int init_kqueue_per_thread() { - int fd; - /* we can have up to two events per fd, so allocate enough to store * 2*fd event, and an extra one, in case EV_RECEIPT isn't defined, * so that we can add an invalid entry and get an error, to avoid @@ -227,8 +225,7 @@ static int init_kqueue_per_thread() * fd for this thread. Let's just mark them as updated, the poller will * do the rest. */ - for (fd = 0; fd < global.maxsock; fd++) - updt_fd_polling(fd); + fd_reregister_all(tgid, ti->ltid_bit); return 1; fail_fd: