diff --git a/lib/event.c b/lib/event.c index 9b5870d3..55a9c487 100644 --- a/lib/event.c +++ b/lib/event.c @@ -125,13 +125,13 @@ ev_schedule(event *e) int ev_run_list(event_list *l) { - node *n, *p; + node *n; list tmp_list; init_list(&tmp_list); add_tail_list(&tmp_list, l); init_list(l); - WALK_LIST_DELSAFE(n, p, tmp_list) + WALK_LIST_FIRST(n, tmp_list) { event *e = SKIP_BACK(event, n, n); ev_run(e); diff --git a/lib/lists.h b/lib/lists.h index 5b36ec83..342dfd62 100644 --- a/lib/lists.h +++ b/lib/lists.h @@ -37,6 +37,9 @@ typedef struct list { /* In fact two overlayed nodes */ n=(void *)((NODE (n))->next)) #define WALK_LIST_DELSAFE(n,nxt,list) \ for(n=HEAD(list); nxt=(void *)((NODE (n))->next); n=(void *) nxt) +/* WALK_LIST_FIRST supposes that called code removes each processed node */ +#define WALK_LIST_FIRST(n,list) \ + while(n=HEAD(list), (NODE (n))->next) #define WALK_LIST_BACKWARDS(n,list) for(n=TAIL(list);(NODE (n))->prev; \ n=(void *)((NODE (n))->prev)) #define WALK_LIST_BACKWARDS_DELSAFE(n,prv,list) \