pthread_mutex_unlock(&dist->mutex);
return squared_deviation_sum;
}
+
+/* TODO(bkjg): add tests for this function */
+int distribution_sub(distribution_t *d1, distribution_t *d2) {
+ if (d1 == NULL || d2 == NULL) {
+ return EINVAL;
+ }
+
+ if (d1->num_buckets != d2->num_buckets) {
+ return EINVAL;
+ }
+
+ pthread_mutex_lock(&d1->mutex);
+ pthread_mutex_lock(&d2->mutex);
+
+ if (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 - d1->tree[i].bucket_counter;
+ }
+ } else {
+ 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;
+ }
+ }
+
+ pthread_mutex_unlock(&d2->mutex);
+ pthread_mutex_unlock(&d1->mutex);
+
+ return 0;
+}
void destroy_buckets_array(buckets_array_t buckets_array);
+/* TODO(bkjg): add description */
+int distribution_sub(distribution_t *d1, distribution_t *d2);
#endif // COLLECTD_DISTRIBUTION_H