aboutsummaryrefslogtreecommitdiffstats
path: root/pingu_ping.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2012-03-14 09:24:45 +0100
committerNatanael Copa <ncopa@alpinelinux.org>2012-03-14 09:40:11 +0100
commit2f5cbff07d2872f78c92efe854385d083c4dfbca (patch)
tree8aac377bfeab26e520f3278dca01277b84919624 /pingu_ping.c
parent97456fa7bb23c22e2a06ca4a99e62e75529f8a91 (diff)
downloadpingu-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.c16
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);
}
}