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.
This commit is contained in:
Martin Mares 1999-10-29 12:08:49 +00:00
parent 92af6f309b
commit 0d70292d88
4 changed files with 14 additions and 14 deletions

View file

@ -53,8 +53,8 @@ ev_new(pool *p)
inline void inline void
ev_run(event *e) ev_run(event *e)
{ {
e->hook(e->data); if (!e->hook(e->data))
ev_postpone(e); ev_postpone(e);
} }
inline void inline void
@ -74,14 +74,11 @@ ev_schedule(event *e)
void void
ev_run_list(event_list *l) ev_run_list(event_list *l)
{ {
for(;;) node *n, *p;
WALK_LIST_DELSAFE(n, p, *l)
{ {
node *n = HEAD(*l); event *e = SKIP_BACK(event, n, n);
event *e;
if (!n->next)
break;
e = SKIP_BACK(event, n, n);
ev_run(e); ev_run(e);
} }
} }

View file

@ -13,7 +13,7 @@
typedef struct event { typedef struct event {
resource r; resource r;
void (*hook)(void *); int (*hook)(void *);
void *data; void *data;
node n; /* Internal link */ node n; /* Internal link */
} event; } event;

View file

@ -36,7 +36,7 @@ static event *proto_flush_event;
static char *p_states[] = { "DOWN", "START", "UP", "STOP" }; static char *p_states[] = { "DOWN", "START", "UP", "STOP" };
static char *c_states[] = { "HUNGRY", "FEEDING", "HAPPY", "FLUSHING" }; static char *c_states[] = { "HUNGRY", "FEEDING", "HAPPY", "FLUSHING" };
static void proto_flush_all(void *); static int proto_flush_all(void *);
static void static void
proto_enqueue(list *l, struct proto *p) proto_enqueue(list *l, struct proto *p)
@ -329,7 +329,7 @@ proto_fell_down(struct proto *p)
proto_rethink_goal(p); proto_rethink_goal(p);
} }
static void static int
proto_feed(void *P) proto_feed(void *P)
{ {
struct proto *p = P; struct proto *p = P;
@ -341,6 +341,7 @@ proto_feed(void *P)
p->core_state = FS_HAPPY; p->core_state = FS_HAPPY;
proto_relink(p); proto_relink(p);
DBG("Protocol %s up and running\n", p->name); DBG("Protocol %s up and running\n", p->name);
return 0;
} }
void void
@ -401,7 +402,7 @@ proto_notify_state(struct proto *p, unsigned ps)
proto_relink(p); proto_relink(p);
} }
static void static int
proto_flush_all(void *unused) proto_flush_all(void *unused)
{ {
struct proto *p; struct proto *p;
@ -417,4 +418,5 @@ proto_flush_all(void *unused)
proto_relink(p); proto_relink(p);
proto_fell_down(p); proto_fell_down(p);
} }
return 0;
} }

View file

@ -395,7 +395,7 @@ rt_dump_all(void)
rt_dump(t); rt_dump(t);
} }
static void static int
rt_gc(void *unused) rt_gc(void *unused)
{ {
rtable *t; rtable *t;
@ -404,6 +404,7 @@ rt_gc(void *unused)
rt_prune_all(); rt_prune_all();
rt_last_gc = now; rt_last_gc = now;
rt_gc_counter = 0; rt_gc_counter = 0;
return 0;
} }
void void