]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Timers: Integrate microsecond timers to the main loop
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 31 May 2017 13:46:04 +0000 (15:46 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Thu, 7 Dec 2017 12:46:53 +0000 (13:46 +0100)
lib/timer.c
sysdep/unix/io.c

index 00ac4b0371ef84cc45dd44353715cac4bc9d9cf4..7ca0bdaa4f45eaceb3f2aef5ed880f850f99fcbc 100644 (file)
@@ -166,6 +166,8 @@ timers_init(struct timeloop *loop, pool *p)
   BUFFER_PUSH(loop->timers) = NULL;
 }
 
+void io_log_event(void *hook, void *data);
+
 void
 timers_fire(struct timeloop *loop)
 {
@@ -195,6 +197,10 @@ timers_fire(struct timeloop *loop)
     else
       tm2_stop(t);
 
+    /* This is ugly hack, we want to log just timers executed from the main I/O loop */
+    if (loop == &main_timeloop)
+      io_log_event(t->hook, t->data);
+
     t->hook(t);
   }
 }
index ebd380ba578d4422b93a25ded8d92251c2aff5a1..136355869ee34eabb082c1e37ab2b3697669c659 100644 (file)
@@ -2507,9 +2507,10 @@ static int short_loops = 0;
 void
 io_loop(void)
 {
-  int poll_tout;
+  int poll_tout, timeout;
   time_t tout;
   int nfds, events, pout;
+  timer2 *t;
   sock *s;
   node *n;
   int fdmax = 256;
@@ -2518,7 +2519,9 @@ io_loop(void)
   watchdog_start1();
   for(;;)
     {
+      times_update(&main_timeloop);
       events = ev_run_list(&global_event_list);
+      timers_fire(&main_timeloop);
     timers:
       update_times();
       tout = tm_first_shot();
@@ -2527,10 +2530,16 @@ io_loop(void)
          tm_shot();
          goto timers;
        }
-      poll_tout = (events ? 0 : MIN(tout - now, 3)) * 1000; /* Time in milliseconds */
-
       io_close_event();
 
+      poll_tout = (events ? 0 : MIN(tout - now, 3)) * 1000; /* Time in milliseconds */
+      if (t = timers_first(&main_timeloop))
+      {
+       times_update(&main_timeloop);
+       timeout = (tm2_remains(t) TO_MS) + 1;
+       poll_tout = MIN(poll_tout, timeout);
+      }
+
       nfds = 0;
       WALK_LIST(n, sock_list)
        {
@@ -2601,6 +2610,8 @@ io_loop(void)
        }
       if (pout)
        {
+         times_update(&main_timeloop);
+
          /* guaranteed to be non-empty */
          current_sock = SKIP_BACK(sock, n, HEAD(sock_list));