From: Paweł Jasiak Date: Mon, 31 Aug 2020 21:42:01 +0000 (+0200) Subject: Avoid deadlocks. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F3554%2Fhead;p=thirdparty%2Fcollectd.git Avoid deadlocks. --- diff --git a/src/daemon/distribution.c b/src/daemon/distribution.c index 3f3c92634..2bc8a22f5 100644 --- a/src/daemon/distribution.c +++ b/src/daemon/distribution.c @@ -247,8 +247,10 @@ double distribution_percentile(distribution_t *dist, double percent) { return NAN; } pthread_mutex_lock(&dist->mutex); - if (dist->tree[0].bucket_counter == 0) + if (dist->tree[0].bucket_counter == 0) { + pthread_mutex_unlock(&dist->mutex); return NAN; + } uint64_t counter = ceil(dist->tree[0].bucket_counter * percent / 100.0); double percentile = tree_get_counter(dist, 0, 0, dist->num_buckets - 1, counter); @@ -261,6 +263,7 @@ double distribution_average(distribution_t *dist) { return NAN; pthread_mutex_lock(&dist->mutex); if (dist->tree[0].bucket_counter == 0) { + pthread_mutex_unlock(&dist->mutex); return NAN; } double average = dist->total_sum / dist->tree[0].bucket_counter; @@ -381,4 +384,4 @@ int distribution_sub(distribution_t *d1, distribution_t *d2) { pthread_mutex_unlock(&d1->mutex); return 0; -} \ No newline at end of file +} diff --git a/src/daemon/distribution_test.c b/src/daemon/distribution_test.c index 3f3dd9e92..d0a27358d 100644 --- a/src/daemon/distribution_test.c +++ b/src/daemon/distribution_test.c @@ -388,6 +388,9 @@ DEF_TEST(average) { for (size_t j = 0; j < cases[i].num_gauges; j++) { distribution_update(cases[i].dist, cases[i].update_gauges[j]); } + EXPECT_EQ_DOUBLE(cases[i].want_average, + distribution_average(cases[i].dist)); + /* Check it second time for deadlocks. */ EXPECT_EQ_DOUBLE(cases[i].want_average, distribution_average(cases[i].dist)); distribution_destroy(cases[i].dist); @@ -445,6 +448,9 @@ DEF_TEST(percentile) { for (size_t j = 0; j < cases[i].num_gauges; j++) { distribution_update(cases[i].dist, cases[i].update_gauges[j]); } + EXPECT_EQ_DOUBLE(cases[i].want_percentile, + distribution_percentile(cases[i].dist, cases[i].percent)); + /* Check it second time for deadlocks. */ EXPECT_EQ_DOUBLE(cases[i].want_percentile, distribution_percentile(cases[i].dist, cases[i].percent)); if (cases[i].want_err != 0)