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:
parent
92af6f309b
commit
0d70292d88
4 changed files with 14 additions and 14 deletions
13
lib/event.c
13
lib/event.c
|
@ -53,7 +53,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue