From: "Fabio M. Di Nitto" <fdinitto@xxxxxxxxxx>
clean up a lot of allocated blocks at exit.
those changes has no runtime effects, but it makes valgrind
output a bit more useful by dropping over 700 errors/warnings to skip
over every single run.
there are still a few icmap related valgrind errors but those need
some more complex and timeconsuming investigation.
pre patch:
==21844== HEAP SUMMARY:
==21844== in use at exit: 1,229,321 bytes in 1,516 blocks
==21844== total heap usage: 7,191 allocs, 5,675 frees, 3,819,853 bytes allocated
==21844== LEAK SUMMARY:
==21844== definitely lost: 3,617 bytes in 11 blocks
==21844== indirectly lost: 21,960 bytes in 11 blocks
==21844== possibly lost: 1,080,101 bytes in 131 blocks
==21844== still reachable: 123,643 bytes in 1,363 blocks
==21844== suppressed: 0 bytes in 0 blocks
==21844== ERROR SUMMARY: 136 errors from 136 contexts (suppressed: 0 from 0)
post patch:
==25793== HEAP SUMMARY:
==25793== in use at exit: 1,185,870 bytes in 808 blocks
==25793== total heap usage: 9,427 allocs, 8,619 frees, 4,156,841 bytes allocated
==25793== LEAK SUMMARY:
==25793== definitely lost: 3,697 bytes in 12 blocks
==25793== indirectly lost: 22,248 bytes in 13 blocks
==25793== possibly lost: 1,079,655 bytes in 113 blocks
==25793== still reachable: 80,270 bytes in 670 blocks
==25793== suppressed: 0 bytes in 0 blocks
==25793== ERROR SUMMARY: 119 errors from 119 contexts (suppressed: 0 from 0)
Signed-off-by: Fabio M. Di Nitto <fdinitto@xxxxxxxxxx>
---
exec/icmap.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++
exec/main.c | 1 +
include/corosync/icmap.h | 1 +
3 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/exec/icmap.c b/exec/icmap.c
index d51a972..2743959 100644
--- a/exec/icmap.c
+++ b/exec/icmap.c
@@ -59,6 +59,7 @@ struct icmap_track {
int32_t track_type;
icmap_notify_fn_t notify_fn;
void *user_data;
+ struct list_head list;
};
struct icmap_ro_access_item {
@@ -68,6 +69,7 @@ struct icmap_ro_access_item {
};
DECLARE_LIST_INIT(icmap_ro_access_item_list_head);
+DECLARE_LIST_INIT(icmap_track_list_head);
/*
* Static functions declarations
@@ -194,6 +196,47 @@ cs_error_t icmap_init(void)
return (qb_to_cs_error(err));
}
+static void icmap_set_ro_access_free(void)
+{
+ struct list_head *iter = icmap_ro_access_item_list_head.next;
+ struct icmap_ro_access_item *icmap_ro_ai;
+
+ while (iter != &icmap_ro_access_item_list_head) {
+ icmap_ro_ai = list_entry(iter, struct icmap_ro_access_item, list);
+ list_del(&icmap_ro_ai->list);
+ free(icmap_ro_ai->key_name);
+ free(icmap_ro_ai);
+ iter = icmap_ro_access_item_list_head.next;
+ }
+}
+
+static void icmap_del_all_track(void)
+{
+ struct list_head *iter = icmap_track_list_head.next;
+ struct icmap_track *icmap_track;
+
+ while (iter != &icmap_track_list_head) {
+ icmap_track = list_entry(iter, struct icmap_track, list);
+ icmap_track_delete(icmap_track);
+ iter = icmap_track_list_head.next;
+ }
+}
+
+void icmap_fini(void)
+{
+ icmap_del_all_track();
+ /*
+ * catch 22 warning:
+ * We need to drop this notify but we can't because it calls icmap_map_free_cb
+ * while destroying the tree to free icmap_item(s).
+ * -> qb_map_notify_del_2(icmap_map, NULL, icmap_map_free_cb, QB_MAP_NOTIFY_FREE, NULL);
+ * and we cannot call it after map_destroy. joy! :)
+ */
+ qb_map_destroy(icmap_map);
+ icmap_set_ro_access_free();
+ return;
+}
+
static int icmap_is_valid_name_char(char c)
{
return ((c >= 'a' && c <= 'z') ||
@@ -864,6 +907,9 @@ cs_error_t icmap_track_add(
return (qb_to_cs_error(err));
}
+ list_init(&(*icmap_track)->list);
+ list_add (&(*icmap_track)->list, &icmap_track_list_head);
+
return (CS_OK);
}
@@ -876,6 +922,7 @@ cs_error_t icmap_track_delete(icmap_track_t icmap_track)
return (qb_to_cs_error(err));
}
+ list_del(&icmap_track->list);
free(icmap_track->key_name);
free(icmap_track);
diff --git a/exec/main.c b/exec/main.c
index 2f3d242..a125bbd 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -192,6 +192,7 @@ static void unlink_all_completed (void)
{
api->timer_delete (corosync_stats_timer_handle);
qb_loop_stop (corosync_poll_handle);
+ icmap_fini();
}
void corosync_shutdown_request (void)
diff --git a/include/corosync/icmap.h b/include/corosync/icmap.h
index 80aac25..4063771 100644
--- a/include/corosync/icmap.h
+++ b/include/corosync/icmap.h
@@ -120,6 +120,7 @@ typedef struct icmap_track *icmap_track_t;
* Initialize icmap
*/
extern cs_error_t icmap_init(void);
+extern void icmap_fini(void);
/*
* Store value with value_len length and type as key_name name in icmap.