aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2023-10-04 17:36:03 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2023-10-04 17:36:03 +0200
commit6a242b3ec66f2ab89f9277e67125eab3e3676644 (patch)
tree64943ba43275e2884e8194e7870dd6bcfc9613bc
parent0bfa216f496279905b843abcfb1242477b86783c (diff)
downloadbird-6a242b3ec66f2ab89f9277e67125eab3e3676644.tar.gz
IO: Fix race condition in event processing
When regular event was added from work event, we did remember that regular event list was empty and therefore we did not use zero time in poll(). This leads to ~3 s latency in route reload during reconfiguration.
-rw-r--r--sysdep/unix/io.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index 6aedcfb6..4b3eef48 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -2226,12 +2226,12 @@ io_loop(void)
for(;;)
{
times_update(&main_timeloop);
- events = ev_run_list(&global_event_list);
- events = ev_run_list_limited(&global_work_list, WORK_EVENTS_MAX) || events;
+ ev_run_list(&global_event_list);
+ ev_run_list_limited(&global_work_list, WORK_EVENTS_MAX);
timers_fire(&main_timeloop);
io_close_event();
- // FIXME
+ events = !EMPTY_LIST(global_event_list) || !EMPTY_LIST(global_work_list);
poll_tout = (events ? 0 : 3000); /* Time in milliseconds */
if (t = timers_first(&main_timeloop))
{