From cc60267c8ddfcc6681106193294da2d8221160cf Mon Sep 17 00:00:00 2001
From: Carl Worth <cworth@cworth.org>
Date: Tue, 22 Oct 2013 17:44:04 -0700
Subject: [PATCH] Free all fip-allocated data when the program exits

This isn't strictly necessary since the operating system is about to
reclaim all of this data anyway.

The only real advantage of doing this is that it enables us to see in
a valgrind report that there aren't any memory leaks due to direct
allocation by code within fips.
---
 metrics.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/metrics.c b/metrics.c
index 38e9e95..5c5cd1b 100644
--- a/metrics.c
+++ b/metrics.c
@@ -77,6 +77,8 @@ typedef struct metrics_group_info
 
 typedef struct metrics_info
 {
+	int initialized;
+
 	unsigned num_groups;
 	metrics_group_info_t *groups;
 } metrics_info_t;
@@ -167,6 +169,24 @@ metrics_group_info_init (metrics_group_info_t *group, GLuint id)
 	}
 }
 
+static void
+metrics_group_info_fini (metrics_group_info_t *group)
+{
+	unsigned i;
+
+	for (i = 0; i < group->num_counters; i++)
+		free (group->counter_names[i]);
+
+	free (group->counter_types);
+	free (group->counter_names);
+	free (group->counters);
+
+	free (group->name);
+}
+
+static void
+metrics_info_fini (metrics_info_t *info);
+
 void
 metrics_info_init (void)
 {
@@ -174,6 +194,9 @@ metrics_info_init (void)
 	GLuint *group_ids;
 	metrics_info_t *metrics_info = &current_context.metrics_info;
 
+	if (metrics_info->initialized)
+		metrics_info_fini (metrics_info);
+
 	glGetPerfMonitorGroupsAMD ((int *) &metrics_info->num_groups, 0, NULL);
 
 	group_ids = xmalloc (metrics_info->num_groups * sizeof (GLuint));
@@ -186,6 +209,19 @@ metrics_info_init (void)
 		metrics_group_info_init (&metrics_info->groups[i], i);
 
 	free (group_ids);
+
+	metrics_info->initialized = 1;
+}
+
+static void
+metrics_info_fini (metrics_info_t *info)
+{
+	unsigned i;
+
+	for (i = 0; i < info->num_groups; i++)
+		metrics_group_info_fini (&info->groups[i]);
+
+	free (info->groups);
 }
 
 static const char *
@@ -499,6 +535,8 @@ metrics_exit (void)
 {
 	if (verbose)
 		printf ("fips: terminating\n");
+
+	metrics_info_fini (&current_context.metrics_info);
 }
 
 
-- 
2.45.2