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.
typedef struct metrics_info
{
typedef struct metrics_info
{
unsigned num_groups;
metrics_group_info_t *groups;
} metrics_info_t;
unsigned num_groups;
metrics_group_info_t *groups;
} metrics_info_t;
+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)
{
void
metrics_info_init (void)
{
GLuint *group_ids;
metrics_info_t *metrics_info = ¤t_context.metrics_info;
GLuint *group_ids;
metrics_info_t *metrics_info = ¤t_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));
glGetPerfMonitorGroupsAMD ((int *) &metrics_info->num_groups, 0, NULL);
group_ids = xmalloc (metrics_info->num_groups * sizeof (GLuint));
metrics_group_info_init (&metrics_info->groups[i], i);
free (group_ids);
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);
{
if (verbose)
printf ("fips: terminating\n");
{
if (verbose)
printf ("fips: terminating\n");
+
+ metrics_info_fini (¤t_context.metrics_info);