aboutsummaryrefslogtreecommitdiffstats
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
parent97456fa7bb23c22e2a06ca4a99e62e75529f8a91 (diff)
downloadpingu-2f5cbff07d2872f78c92efe854385d083c4dfbca.tar.bz2
pingu-2f5cbff07d2872f78c92efe854385d083c4dfbca.tar.xz
pingu_ping: always stop ev timer when cleaning up ping list
-rw-r--r--pingu.c2
-rw-r--r--pingu_iface.c4
-rw-r--r--pingu_iface.h3
-rw-r--r--pingu_ping.c16
-rw-r--r--pingu_ping.h2
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