]> git.cworth.org Git - fips/commitdiff
Free all fip-allocated data when the program exits
authorCarl Worth <cworth@cworth.org>
Wed, 23 Oct 2013 00:44:04 +0000 (17:44 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 23 Oct 2013 00:44:04 +0000 (17:44 -0700)
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

index 38e9e954a6fc7dc941ce4bb608d76d1e886a4a32..5c5cd1b77585cf881260e75cfab023ed754102c4 100644 (file)
--- 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);
 }