diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2012-03-14 09:24:45 +0100 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2012-03-14 09:40:11 +0100 |
commit | 2f5cbff07d2872f78c92efe854385d083c4dfbca (patch) | |
tree | 8aac377bfeab26e520f3278dca01277b84919624 /pingu_ping.c | |
parent | 97456fa7bb23c22e2a06ca4a99e62e75529f8a91 (diff) | |
download | pingu-2f5cbff07d2872f78c92efe854385d083c4dfbca.tar.bz2 pingu-2f5cbff07d2872f78c92efe854385d083c4dfbca.tar.xz |
pingu_ping: always stop ev timer when cleaning up ping list
Diffstat (limited to 'pingu_ping.c')
-rw-r--r-- | pingu_ping.c | 16 |
1 files changed, 10 insertions, 6 deletions
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); } } |