diff options
author | pjd <pjd@FreeBSD.org> | 2012-01-22 11:20:42 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2012-01-22 11:20:42 +0000 |
commit | 983cddf8a649edca44dbee0a310b2ef2f220967d (patch) | |
tree | 065380bec9dc8ec1b1b46d467d3c185307fc4b42 /sbin/hastd | |
parent | da783c4b78e818e376b972a164fb451689b1bc01 (diff) | |
download | FreeBSD-src-983cddf8a649edca44dbee0a310b2ef2f220967d.zip FreeBSD-src-983cddf8a649edca44dbee0a310b2ef2f220967d.tar.gz |
Free memory that won't be used in child.
MFC after: 1 week
Diffstat (limited to 'sbin/hastd')
-rw-r--r-- | sbin/hastd/hastd.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c index 945f4dc..e3b946c 100644 --- a/sbin/hastd/hastd.c +++ b/sbin/hastd/hastd.c @@ -99,10 +99,10 @@ g_gate_load(void) void descriptors_cleanup(struct hast_resource *res) { - struct hast_resource *tres; + struct hast_resource *tres, *tmres; struct hastd_listen *lst; - TAILQ_FOREACH(tres, &cfg->hc_resources, hr_next) { + TAILQ_FOREACH_SAFE(tres, &cfg->hc_resources, hr_next, tmres) { if (tres == res) { PJDLOG_VERIFY(res->hr_role == HAST_ROLE_SECONDARY || (res->hr_remotein == NULL && @@ -119,13 +119,17 @@ descriptors_cleanup(struct hast_resource *res) proto_close(tres->hr_event); if (tres->hr_conn != NULL) proto_close(tres->hr_conn); + TAILQ_REMOVE(&cfg->hc_resources, tres, hr_next); + free(tres); } if (cfg->hc_controlin != NULL) proto_close(cfg->hc_controlin); proto_close(cfg->hc_controlconn); - TAILQ_FOREACH(lst, &cfg->hc_listen, hl_next) { + while ((lst = TAILQ_FIRST(&cfg->hc_listen)) != NULL) { + TAILQ_REMOVE(&cfg->hc_listen, lst, hl_next); if (lst->hl_conn != NULL) proto_close(lst->hl_conn); + free(lst); } (void)pidfile_close(pfh); hook_fini(); |