From: Donald Sharp Date: Thu, 2 Nov 2023 20:46:27 +0000 (-0400) Subject: lib: Modify event system to treat fd access more fairly X-Git-Tag: base_10.0~279^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=57ea8ac8c34e347e541239019784167090785850;p=matthieu%2Ffrr.git lib: Modify event system to treat fd access more fairly Keep track of the last starting spot of where fd's were being handled for read operations. Modify the io read handler to cycle through the list of fd's that need to be handled such that fd's at the front do not take precedence for being handled all the time. Signed-off-by: Donald Sharp --- diff --git a/lib/event.c b/lib/event.c index f5ebd01973..6e55310b65 100644 --- a/lib/event.c +++ b/lib/event.c @@ -1649,6 +1649,10 @@ static inline void thread_process_io_inner_loop(struct event_loop *m, * Walks through file descriptor array looking for those pollfds whose .revents * field has something interesting. Deletes any invalid file descriptors. * + * Try to impart some impartiality to handling of io. The event + * system will cycle through the fd's available for io + * giving each one a chance to go first. + * * @param m the thread master * @param num the number of active file descriptors (return value of poll()) */ @@ -1656,10 +1660,15 @@ static void thread_process_io(struct event_loop *m, unsigned int num) { unsigned int ready = 0; struct pollfd *pfds = m->handler.copy; + nfds_t i, last_read = m->last_read % m->handler.copycount; - for (nfds_t i = 0; i < m->handler.copycount && ready < num; ++i) { - thread_process_io_inner_loop(m, num, pfds, &i, &ready); - } + for (i = last_read; i < m->handler.copycount && ready < num; ++i) + thread_process_io_inner_loop(m, num, pfds, &i, &ready); + + for (i = 0; i < last_read && ready < num; ++i) + thread_process_io_inner_loop(m, num, pfds, &i, &ready); + + m->last_read++; } /* Add all timers that have popped to the ready list. */ diff --git a/lib/frrevent.h b/lib/frrevent.h index 3f74df359b..616fe131af 100644 --- a/lib/frrevent.h +++ b/lib/frrevent.h @@ -91,6 +91,8 @@ struct event_loop { pthread_mutex_t mtx; pthread_t owner; + nfds_t last_read; + bool ready_run_loop; RUSAGE_T last_getrusage; };