diff options
author | Martin Mares <mj@ucw.cz> | 1999-10-29 14:08:49 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1999-10-29 14:08:49 +0200 |
commit | 0d70292d88276a9883ab8bc15b00e6a2e2fe4487 (patch) | |
tree | 19985b61964aacd88b239cefbea547cca85eccb9 | |
parent | 92af6f309b9283482384bd9bbd0351cd71e3cf1d (diff) | |
download | bird-0d70292d88276a9883ab8bc15b00e6a2e2fe4487.tar bird-0d70292d88276a9883ab8bc15b00e6a2e2fe4487.zip |
Events now return a value. If it's non-zero, the event is re-queued
for processing in next event cycle. This can be used to prevent background
actions (hint: user commands) from hogging the CPU for too long time.
-rw-r--r-- | lib/event.c | 15 | ||||
-rw-r--r-- | lib/event.h | 2 | ||||
-rw-r--r-- | nest/proto.c | 8 | ||||
-rw-r--r-- | nest/rt-table.c | 3 |
4 files changed, 14 insertions, 14 deletions
diff --git a/lib/event.c b/lib/event.c index 962c640..e9ae3be 100644 --- a/lib/event.c +++ b/lib/event.c @@ -53,8 +53,8 @@ ev_new(pool *p) inline void ev_run(event *e) { - e->hook(e->data); - ev_postpone(e); + if (!e->hook(e->data)) + ev_postpone(e); } inline void @@ -74,14 +74,11 @@ ev_schedule(event *e) void ev_run_list(event_list *l) { - for(;;) + node *n, *p; + + WALK_LIST_DELSAFE(n, p, *l) { - node *n = HEAD(*l); - event *e; - if (!n->next) - break; - e = SKIP_BACK(event, n, n); + event *e = SKIP_BACK(event, n, n); ev_run(e); } } - diff --git a/lib/event.h b/lib/event.h index 0b1ea84..0856fbb 100644 --- a/lib/event.h +++ b/lib/event.h @@ -13,7 +13,7 @@ typedef struct event { resource r; - void (*hook)(void *); + int (*hook)(void *); void *data; node n; /* Internal link */ } event; diff --git a/nest/proto.c b/nest/proto.c index bbf5d59..3430176 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -36,7 +36,7 @@ static event *proto_flush_event; static char *p_states[] = { "DOWN", "START", "UP", "STOP" }; static char *c_states[] = { "HUNGRY", "FEEDING", "HAPPY", "FLUSHING" }; -static void proto_flush_all(void *); +static int proto_flush_all(void *); static void proto_enqueue(list *l, struct proto *p) @@ -329,7 +329,7 @@ proto_fell_down(struct proto *p) proto_rethink_goal(p); } -static void +static int proto_feed(void *P) { struct proto *p = P; @@ -341,6 +341,7 @@ proto_feed(void *P) p->core_state = FS_HAPPY; proto_relink(p); DBG("Protocol %s up and running\n", p->name); + return 0; } void @@ -401,7 +402,7 @@ proto_notify_state(struct proto *p, unsigned ps) proto_relink(p); } -static void +static int proto_flush_all(void *unused) { struct proto *p; @@ -417,4 +418,5 @@ proto_flush_all(void *unused) proto_relink(p); proto_fell_down(p); } + return 0; } diff --git a/nest/rt-table.c b/nest/rt-table.c index 0f423f8..353473d 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -395,7 +395,7 @@ rt_dump_all(void) rt_dump(t); } -static void +static int rt_gc(void *unused) { rtable *t; @@ -404,6 +404,7 @@ rt_gc(void *unused) rt_prune_all(); rt_last_gc = now; rt_gc_counter = 0; + return 0; } void |