]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added simple event scheduling system to avoid recursive calling
authorMartin Mares <mj@ucw.cz>
Thu, 11 Feb 1999 21:18:26 +0000 (21:18 +0000)
committerMartin Mares <mj@ucw.cz>
Thu, 11 Feb 1999 21:18:26 +0000 (21:18 +0000)
of various callbacks.

Events are just another resource type objects (thus automatically freed
and unlinked when the protocol using them shuts down). Each event can
be linked in at most one event list. For most purposes, just use the
global event list handled by the following functions:

ev_schedule Schedule event to be called at the next event
scheduling point. If the event was already
scheduled, it's just re-linked to the end of the list.
ev_postpone Postpone an already scheduled event, so that it
won't get called. Postponed events can be scheduled
again by ev_schedule().

You can also create custom event lists to build your own synchronization
primitives. Just use:

ev_init_list to initialize an event list
ev_enqueue to schedule event on specified event list
ev_postpone works as well for custom lists
ev_run_list to run all events on your custom list
ev_run to run a specific event and dequeue it

TODO
lib/Modules
sysdep/unix/io.c

diff --git a/TODO b/TODO
index f681997ccc31ed7b6bc239daec8f29cbb5bad0e2..3160b34f1596e7aa2deb7737b7b0eea2fbba06b5 100644 (file)
--- a/TODO
+++ b/TODO
@@ -8,6 +8,7 @@ Core
 
 * Fix router ID calculation
 * debug dump: dump router ID as well
+* proto_report_state() !
 
 - TOS not supported by kernel -> automatically drop routes with TOS<>0
 
index b347aa21b90aea470dd0de2eab6e665033c5071a..19a790000177d360dad1e5383f6ccf579874d33c 100644 (file)
@@ -25,3 +25,5 @@ string.h
 patmatch.c
 slists.c
 slists.h
+event.c
+event.h
index 0d8f125786731443048efb446e9cbce7fd1bcaa8..bb8f8afa4420c25eecc1774495ae81a55e0b2504 100644 (file)
@@ -20,6 +20,7 @@
 #include "lib/resource.h"
 #include "lib/timer.h"
 #include "lib/socket.h"
+#include "lib/event.h"
 #include "nest/iface.h"
 
 #include "lib/unix.h"
@@ -58,7 +59,7 @@ tm_dump(resource *r)
 {
   timer *t = (timer *) r;
 
-  debug("(code %p, data %p, ");
+  debug("(code %p, data %p, ", t->hook, t->data);
   if (t->randomize)
     debug("rand %d, ", t->randomize);
   if (t->recurrent)
@@ -682,6 +683,7 @@ io_init(void)
   init_list(&near_timers);
   init_list(&far_timers);
   init_list(&sock_list);
+  init_list(&global_event_list);
   now = time(NULL);
 }
 
@@ -701,6 +703,7 @@ io_loop(void)
   FD_ZERO(&wr);
   for(;;)
     {
+      ev_run_list(&global_event_list);
       now = time(NULL);
       tout = tm_first_shot();
       if (tout <= now)