static inline int proto_is_done(struct proto *p)
{ return (p->proto_state == PS_DOWN) && proto_is_inactive(p); }
-static inline event_list *proto_event_list(struct proto *p)
-{ return p->loop == &main_birdloop ? &global_event_list : birdloop_event_list(p->loop); }
-
-static inline event_list *proto_work_list(struct proto *p)
-{ return p->loop == &main_birdloop ? &global_work_list : birdloop_event_list(p->loop); }
-
-static inline void proto_send_event(struct proto *p)
-{ ev_send(proto_event_list(p), p->event); }
-
-#define PROTO_ENTER_FROM_MAIN(p) ({ \
- ASSERT_DIE(birdloop_inside(&main_birdloop)); \
- struct birdloop *_loop = (p)->loop; \
- if (_loop != &main_birdloop) birdloop_enter(_loop); \
- _loop; \
- })
-
-#define PROTO_LEAVE_FROM_MAIN(loop) ({ if (loop != &main_birdloop) birdloop_leave(loop); })
-
-#define PROTO_LOCKED_FROM_MAIN(p) for (struct birdloop *_proto_loop = PROTO_ENTER_FROM_MAIN(p); _proto_loop; PROTO_LEAVE_FROM_MAIN(_proto_loop), (_proto_loop = NULL))
-
-
static inline int channel_is_active(struct channel *c)
{ return (c->channel_state != CS_DOWN); }
return;
channel_set_state(c, CS_DOWN);
- proto_send_event(c->proto);
+ proto_send_event(c->proto, c->proto->event);
break;
case CS_PAUSE:
/* Schedule protocol shutddown */
if (proto_is_done(c->proto))
- proto_send_event(c->proto);
+ proto_send_event(c->proto, c->proto->event);
}
void
rt_destroy_sources(&p->sources, p->event);
p->do_stop = 1;
- proto_send_event(p);
+ proto_send_event(p, p->event);
}
static void
/* Shutdown is finished in the protocol event */
if (proto_is_done(p))
- proto_send_event(p);
+ proto_send_event(p, p->event);
}
#define DEFAULT_GR_WAIT 240
+static inline event_list *proto_event_list(struct proto *p)
+{ return p->loop == &main_birdloop ? &global_event_list : birdloop_event_list(p->loop); }
+
+static inline event_list *proto_work_list(struct proto *p)
+{ return p->loop == &main_birdloop ? &global_work_list : birdloop_event_list(p->loop); }
+
+static inline void proto_send_event(struct proto *p, event *e)
+{ ev_send(proto_event_list(p), e); }
+
void channel_show_limit(struct limit *l, const char *dsc, int active, int action);
void channel_show_info(struct channel *c);
void channel_cmd_debug(struct channel *c, uint mask);
#define PROTO_WALK_CMD(sym,pr,p) for(struct proto *p = NULL; p = proto_iterate_named(sym, pr, p); )
+#define PROTO_ENTER_FROM_MAIN(p) ({ \
+ ASSERT_DIE(birdloop_inside(&main_birdloop)); \
+ struct birdloop *_loop = (p)->loop; \
+ if (_loop != &main_birdloop) birdloop_enter(_loop); \
+ _loop; \
+ })
+
+#define PROTO_LEAVE_FROM_MAIN(loop) ({ if (loop != &main_birdloop) birdloop_leave(loop); })
+
+#define PROTO_LOCKED_FROM_MAIN(p) for (struct birdloop *_proto_loop = PROTO_ENTER_FROM_MAIN(p); _proto_loop; PROTO_LEAVE_FROM_MAIN(_proto_loop), (_proto_loop = NULL))
+
#define CMD_RELOAD 0
#define CMD_RELOAD_IN 1