From: Svetlana Shmidt Date: Mon, 7 Sep 2020 11:01:41 +0000 (+0000) Subject: change distribution_sub function in order d1 >= d2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=515094425791ce83bbb95ffa9adec1fe19311326;p=thirdparty%2Fcollectd.git change distribution_sub function in order d1 >= d2 --- diff --git a/src/daemon/distribution.c b/src/daemon/distribution.c index ceb3f4f7e..a6f04f12a 100644 --- a/src/daemon/distribution.c +++ b/src/daemon/distribution.c @@ -374,31 +374,20 @@ int distribution_cmp(distribution_t *d1, distribution_t *d2) { /* TODO(bkjg): add tests for this function */ int distribution_sub(distribution_t *d1, distribution_t *d2) { - if (d1->total_sum < d2->total_sum) { - d1->total_sum = d2->total_sum - d1->total_sum; - for (size_t i = 0; i < tree_size(d1->num_buckets); ++i) { - if (d1->tree[i].maximum != d2->tree[i].maximum || - d1->tree[i].bucket_counter > d2->tree[i].bucket_counter) { - pthread_mutex_unlock(&d2->mutex); - pthread_mutex_unlock(&d1->mutex); - return EINVAL; - } - - d1->tree[i].bucket_counter = - d2->tree[i].bucket_counter - d1->tree[i].bucket_counter; - } - } else { - d1->total_sum -= d2->total_sum; - for (size_t i = 0; i < tree_size(d1->num_buckets); ++i) { - if (d1->tree[i].maximum != d2->tree[i].maximum || - d1->tree[i].bucket_counter < d2->tree[i].bucket_counter) { - pthread_mutex_unlock(&d2->mutex); - pthread_mutex_unlock(&d1->mutex); - return EINVAL; - } - - d1->tree[i].bucket_counter -= d2->tree[i].bucket_counter; - } + int cmp_status = distribution_cmp(d1, d2); + if (cmp_status != 1 && cmp_status != 0) { // i.e. d1 < d2 or can't compare + if (cmp_status == -1) + cmp_status = ERANGE; + return cmp_status; + } + + pthread_mutex_lock(&d1->mutex); + pthread_mutex_lock(&d2->mutex); + + d1->total_sum -= d2->total_sum; + d1->total_square_sum -= d2->total_square_sum; + for (size_t i = 0; i < tree_size(d1->num_buckets); i++) { + d1->tree[i].bucket_counter -= d2.tree[i].bucket_counter; } pthread_mutex_unlock(&d2->mutex);