]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
IO: Avoid multiple event cycles in one loop cycle.
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 6 Apr 2016 09:57:28 +0000 (11:57 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 6 Apr 2016 09:57:28 +0000 (11:57 +0200)
Event cycle may took too much time and trigger next timer events, so
avoid cycling between timer and event cycles inside the loop cycle.

proto/bgp/bgp.c
sysdep/unix/io.c

index 7328cb79a71108179232282e2d65938c772eaa61..94c8e5c24df40da5a72265a5ba71db4a779232ee 100644 (file)
@@ -668,6 +668,10 @@ bgp_keepalive_timeout(timer *t)
 
   DBG("BGP: Keepalive timer\n");
   bgp_schedule_packet(conn, PKT_KEEPALIVE);
+
+  /* Kick TX a bit faster */
+  if (ev_active(conn->tx_ev))
+    ev_run(conn->tx_ev);
 }
 
 static void
index 078fe73c2e70858c5e19ada31f2c180b91402d39..5955dbfef52fd8efbcfa3ccbc6d1fc292c8e9229 100644 (file)
@@ -2055,12 +2055,13 @@ io_loop(void)
   for(;;)
     {
       events = ev_run_list(&global_event_list);
+    timers:
       update_times();
       tout = tm_first_shot();
       if (tout <= now)
        {
          tm_shot();
-         continue;
+         goto timers;
        }
       poll_tout = (events ? 0 : MIN(tout - now, 3)) * 1000; /* Time in milliseconds */