From 96f357c5d698dcbb8edbf53b9d0c9d99f888d432 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Tue, 10 Sep 2024 11:25:59 +0200 Subject: [PATCH] Minimalist mainloop implementation --- lib/io-loop.h | 2 ++ sysdep/unix/io-loop.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/lib/io-loop.h b/lib/io-loop.h index cd4e2132..c043d1a0 100644 --- a/lib/io-loop.h +++ b/lib/io-loop.h @@ -82,5 +82,7 @@ struct thread_config { void bird_thread_commit(struct thread_config *new); +/* Minimalist main */ +void birdloop_minimalist_main(void) NORET; #endif /* _BIRD_IO_LOOP_H_ */ diff --git a/sysdep/unix/io-loop.c b/sysdep/unix/io-loop.c index 9d2aa83f..afe60621 100644 --- a/sysdep/unix/io-loop.c +++ b/sysdep/unix/io-loop.c @@ -1594,3 +1594,41 @@ ev_send_defer(event *e) else ev_send(&this_birdloop->defer_list, e); } + +/* + * Minimalist mainloop with no sockets + */ + +void +birdloop_minimalist_main(void) +{ + while (1) + { + times_update(); + ev_run_list(&global_event_list); + ev_run_list(&global_work_list); + ev_run_list(&main_birdloop.event_list); + timers_fire(&main_birdloop.time); + + bool events = + !ev_list_empty(&global_event_list) || + !ev_list_empty(&global_work_list) || + !ev_list_empty(&main_birdloop.event_list); + + int poll_tout = (events ? 0 : 3000); /* Time in milliseconds */ + timer *t; + if (t = timers_first(&main_birdloop.time)) + { + times_update(); + int timeout = (tm_remains(t) TO_MS) + 1; + poll_tout = MIN(poll_tout, timeout); + } + + struct pollfd pfd = { + .fd = main_birdloop.thread->wakeup.fd[0], + .events = POLLIN, + }; + + poll(&pfd, 1, poll_tout); + } +}