From 55e29dfe5b69bf141b6927a6f072c1d9da48b4f0 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Tue, 26 May 2015 20:11:53 +0200 Subject: [PATCH] [Issue #26] Fixed the stack explosion when cleaning up too many assertion stats --- src/stats.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/stats.c b/src/stats.c index 3d27db2..e7d60a6 100644 --- a/src/stats.c +++ b/src/stats.c @@ -41,7 +41,10 @@ typedef struct criterion_assert_stats s_assert_stats; static void destroy_stats(void *ptr, UNUSED void *meta) { s_glob_stats *stats = ptr; - sfree(stats->suites); + for (s_suite_stats *s = stats->suites, *next; s; s = next) { + next = s->next; + sfree(s); + } } s_glob_stats *stats_init(void) { @@ -50,8 +53,10 @@ s_glob_stats *stats_init(void) { static void destroy_suite_stats(void *ptr, UNUSED void *meta) { s_suite_stats *stats = ptr; - sfree(stats->tests); - sfree(stats->next); + for (s_test_stats *t = stats->tests, *next; t; t = next) { + next = t->next; + sfree(t); + } } s_suite_stats *suite_stats_init(struct criterion_suite *s) { @@ -62,8 +67,10 @@ s_suite_stats *suite_stats_init(struct criterion_suite *s) { static void destroy_test_stats(void *ptr, UNUSED void *meta) { s_test_stats *stats = ptr; - sfree(stats->asserts); - sfree(stats->next); + for (s_assert_stats *a = stats->asserts, *next; a; a = next) { + next = a->next; + sfree(a); + } } s_test_stats *test_stats_init(struct criterion_test *t) { @@ -128,16 +135,11 @@ static void push_pre_init(s_glob_stats *stats, } } -static void destroy_assert(void *ptr, UNUSED void *meta) { - s_assert_stats *data = ptr; - sfree(data->next); -} - static void push_assert(s_glob_stats *stats, s_suite_stats *suite, s_test_stats *test, s_assert_stats *data) { - s_assert_stats *dup = unique_ptr(s_assert_stats, (*data), destroy_assert); + s_assert_stats *dup = unique_ptr(s_assert_stats, (*data)); dup->next = test->asserts; test->asserts = dup;