X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=metrics.c;h=5c5cd1b77585cf881260e75cfab023ed754102c4;hb=cc60267c8ddfcc6681106193294da2d8221160cf;hp=f1f44287342574b7d41769ea0be6c346bedd40b9;hpb=6256917740cf81e158aa06bf89f495c4ab74af16;p=fips diff --git a/metrics.c b/metrics.c index f1f4428..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 = ¤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)); @@ -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 (¤t_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;