]> git.cworth.org Git - fips/blobdiff - metrics.c
Free all fip-allocated data when the program exits
[fips] / metrics.c
index f1f44287342574b7d41769ea0be6c346bedd40b9..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 *
@@ -489,6 +525,8 @@ print_program_metrics (void)
 
        for (i = 0; i < ctx->num_op_metrics; i++)
                print_op_metrics (ctx, &ctx->op_metrics[sorted[i]], total);
+
+       free (sorted);
 }
 
 /* Called at program exit */
@@ -497,6 +535,8 @@ metrics_exit (void)
 {
        if (verbose)
                printf ("fips: terminating\n");
+
+       metrics_info_fini (&current_context.metrics_info);
 }
 
 
@@ -574,6 +614,8 @@ metrics_end_frame (void)
 
                accumulate_program_metrics (monitor->op, result, result_size);
 
+               free (result);
+
                current_context.monitor_head = monitor->next;
                if (current_context.monitor_head == NULL)
                        current_context.monitor_tail = NULL;