From 2f5cbff07d2872f78c92efe854385d083c4dfbca Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 14 Mar 2012 09:24:45 +0100 Subject: pingu_ping: always stop ev timer when cleaning up ping list --- pingu.c | 2 +- pingu_iface.c | 4 ++-- pingu_iface.h | 3 +-- pingu_ping.c | 16 ++++++++++------ pingu_ping.h | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/pingu.c b/pingu.c index 39954d9..40f278f 100644 --- a/pingu.c +++ b/pingu.c @@ -183,7 +183,7 @@ int main(int argc, char *argv[]) ev_run(loop, 0); log_info("Shutting down"); - pingu_iface_cleanup(); + pingu_iface_cleanup(loop); pingu_host_cleanup(); kernel_close(); ev_loop_destroy(loop); diff --git a/pingu_iface.c b/pingu_iface.c index 161a327..e4326d5 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -272,7 +272,7 @@ int pingu_iface_init(struct ev_loop *loop) return 0; } -void pingu_iface_cleanup(void) +void pingu_iface_cleanup(struct ev_loop *loop) { struct pingu_iface *iface, *n; /* remove loadbalance route */ @@ -294,7 +294,7 @@ void pingu_iface_cleanup(void) free(iface->gw_up_action); if (iface->gw_down_action != NULL) free(iface->gw_down_action); - pingu_ping_cleanup(&iface->ping_list); + pingu_ping_cleanup(loop, &iface->ping_list); pingu_route_cleanup(&iface->route_list); free(iface); } diff --git a/pingu_iface.h b/pingu_iface.h index d999657..53c5fa8 100644 --- a/pingu_iface.h +++ b/pingu_iface.h @@ -55,6 +55,5 @@ void pingu_iface_gw_action(struct pingu_iface *iface, void pingu_iface_dump_status(int fd, char *filter); void pingu_iface_update_routes(struct pingu_iface *iface, int action); -void pingu_iface_cleanup(void); - +void pingu_iface_cleanup(struct ev_loop *loop); #endif diff --git a/pingu_ping.c b/pingu_ping.c index 3eb413d..8ef0596 100644 --- a/pingu_ping.c +++ b/pingu_ping.c @@ -33,17 +33,22 @@ static void pingu_ping_free(struct ev_loop *loop, struct pingu_ping *ping) { list_del(&ping->ping_list_entry); ev_timer_stop(loop, &ping->timeout_watcher); - pingu_host_verify_status(loop, ping->host); free(ping); } +static void pingu_ping_verify_and_free(struct ev_loop *loop, struct pingu_ping *ping) +{ + pingu_host_verify_status(loop, ping->host); + pingu_ping_free(loop, ping); +} + static void pingu_ping_timeout_cb(struct ev_loop *loop, ev_timer *w, int revents) { struct pingu_ping *ping = container_of(w, struct pingu_ping, timeout_watcher); log_debug("%s: seq %i (%i/%i) timed out", ping->host->label, ping->seq, ping->host->burst.pings_sent, ping->host->max_retries); - pingu_ping_free(loop, ping); + pingu_ping_verify_and_free(loop, ping); } static struct pingu_ping *pingu_ping_add(struct ev_loop *loop, @@ -85,7 +90,7 @@ static void pingu_ping_handle_reply(struct ev_loop *loop, log_debug("%s: got seq %i (%i/%i)", ping->host->label, ping->seq, ping->host->burst.pings_replied, ping->host->required_replies); - pingu_ping_free(loop, ping); + pingu_ping_verify_and_free(loop, ping); } int pingu_ping_send(struct ev_loop *loop, struct pingu_host *host, @@ -130,11 +135,10 @@ void pingu_ping_read_reply(struct ev_loop *loop, struct pingu_iface *iface) pingu_ping_handle_reply(loop, ping); } -void pingu_ping_cleanup(struct list_head *ping_list) +void pingu_ping_cleanup(struct ev_loop *loop, struct list_head *ping_list) { struct pingu_ping *ping, *n; list_for_each_entry_safe(ping, n, ping_list, ping_list_entry) { - list_del(&ping->ping_list_entry); - free(ping); + pingu_ping_free(loop, ping); } } diff --git a/pingu_ping.h b/pingu_ping.h index 167f29a..52c977e 100644 --- a/pingu_ping.h +++ b/pingu_ping.h @@ -19,6 +19,6 @@ struct pingu_ping { int pingu_ping_send(struct ev_loop *loop, struct pingu_host *host, int set_status_on_failure); void pingu_ping_read_reply(struct ev_loop *loop, struct pingu_iface *iface); -void pingu_ping_cleanup(struct list_head *ping_list); +void pingu_ping_cleanup(struct ev_loop *loop, struct list_head *ping_list); #endif -- cgit v1.2.3