]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Loop flags: a simple idempotent event announcement mechanism
authorMaria Matejka <mq@ucw.cz>
Mon, 12 Sep 2022 08:24:55 +0000 (10:24 +0200)
committerMaria Matejka <mq@ucw.cz>
Sun, 18 Sep 2022 14:33:51 +0000 (16:33 +0200)
lib/io-loop.h
sysdep/unix/io-loop.c
sysdep/unix/io-loop.h

index 2450a60929c06dd25df141ab415069ebfb638275..ae58bbee7d54eec11a5424a404ed477399cc4924 100644 (file)
@@ -50,6 +50,14 @@ void birdloop_unlink(struct birdloop *loop);
 
 void birdloop_ping(struct birdloop *loop);
 
+struct birdloop_flag_handler {
+  void (*hook)(struct birdloop_flag_handler *, u32 flags);
+  void *data;
+};
+
+void birdloop_flag(struct birdloop *loop, u32 flag);
+void birdloop_flag_set_handler(struct birdloop *, struct birdloop_flag_handler *);
+
 void birdloop_init(void);
 
 /* Yield for a little while. Use only in special cases. */
index b7c858c6e1fcb22ed987f4ebd340a5dea6f53ce8..575e5403cb7a8c7ef4b518cedcda33076db196a2 100644 (file)
@@ -59,6 +59,31 @@ birdloop_inside(struct birdloop *loop)
   return 0;
 }
 
+void
+birdloop_flag(struct birdloop *loop, u32 flag)
+{
+  atomic_fetch_or_explicit(&loop->flags, flag, memory_order_acq_rel);
+  birdloop_ping(loop);
+}
+
+void
+birdloop_flag_set_handler(struct birdloop *loop, struct birdloop_flag_handler *fh)
+{
+  ASSERT_DIE(birdloop_inside(loop));
+  loop->flag_handler = fh;
+}
+
+static int
+birdloop_process_flags(struct birdloop *loop)
+{
+  if (!loop->flag_handler)
+    return 0;
+
+  u32 flags = atomic_exchange_explicit(&loop->flags, 0, memory_order_acq_rel);
+  loop->flag_handler->hook(loop->flag_handler, flags);
+  return !!flags;
+}
+
 /*
  *     Wakeup code for birdloop
  */
@@ -516,7 +541,7 @@ birdloop_main(void *arg)
   while (1)
   {
     timers_fire(&loop->time, 0);
-    if (ev_run_list(&loop->event_list))
+    if (birdloop_process_flags(loop) + ev_run_list(&loop->event_list))
       timeout = 0;
     else if (t = timers_first(&loop->time))
       timeout = (tm_remains(t) TO_MS) + 1;
index 31c4045970dc5705dd4b78880e2067747a4aeb26..aec7a4093aac608fff661e15bc608844bbb1f06b 100644 (file)
@@ -34,6 +34,9 @@ struct birdloop
 
   uint links;
 
+  _Atomic u32 flags;
+  struct birdloop_flag_handler *flag_handler;
+
   void (*stopped)(void *data);
   void *stop_data;