|  | @@ -126,25 +126,35 @@ void gpr_histogram_add(gpr_histogram *h, double x) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int gpr_histogram_merge(gpr_histogram *dst, gpr_histogram *src) {
 | 
	
		
			
				|  |  | -  size_t i;
 | 
	
		
			
				|  |  |    if ((dst->num_buckets != src->num_buckets) ||
 | 
	
		
			
				|  |  |        (dst->multiplier != src->multiplier)) {
 | 
	
		
			
				|  |  |      /* Fail because these histograms don't match */
 | 
	
		
			
				|  |  |      return 0;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  dst->sum += src->sum;
 | 
	
		
			
				|  |  | -  dst->sum_of_squares += src->sum_of_squares;
 | 
	
		
			
				|  |  | -  dst->count += src->count;
 | 
	
		
			
				|  |  | -  if (src->min_seen < dst->min_seen) {
 | 
	
		
			
				|  |  | -    dst->min_seen = src->min_seen;
 | 
	
		
			
				|  |  | +  gpr_histogram_merge_contents(dst, src->buckets, src->num_buckets,
 | 
	
		
			
				|  |  | +                               src->min_seen, src->max_seen, src->sum,
 | 
	
		
			
				|  |  | +                               src->sum_of_squares, src->count);
 | 
	
		
			
				|  |  | +  return 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void gpr_histogram_merge_contents(gpr_histogram *dst, const gpr_uint32 *data,
 | 
	
		
			
				|  |  | +                                  size_t data_count, double min_seen,
 | 
	
		
			
				|  |  | +                                  double max_seen, double sum,
 | 
	
		
			
				|  |  | +                                  double sum_of_squares, double count) {
 | 
	
		
			
				|  |  | +  size_t i;
 | 
	
		
			
				|  |  | +  GPR_ASSERT(dst->num_buckets == data_count);
 | 
	
		
			
				|  |  | +  dst->sum += sum;
 | 
	
		
			
				|  |  | +  dst->sum_of_squares += sum_of_squares;
 | 
	
		
			
				|  |  | +  dst->count += count;
 | 
	
		
			
				|  |  | +  if (min_seen < dst->min_seen) {
 | 
	
		
			
				|  |  | +    dst->min_seen = min_seen;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (src->max_seen > dst->max_seen) {
 | 
	
		
			
				|  |  | -    dst->max_seen = src->max_seen;
 | 
	
		
			
				|  |  | +  if (max_seen > dst->max_seen) {
 | 
	
		
			
				|  |  | +    dst->max_seen = max_seen;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    for (i = 0; i < dst->num_buckets; i++) {
 | 
	
		
			
				|  |  | -    dst->buckets[i] += src->buckets[i];
 | 
	
		
			
				|  |  | +    dst->buckets[i] += data[i];
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static double threshold_for_count_below(gpr_histogram *h, double count_below) {
 | 
	
	
		
			
				|  | @@ -222,3 +232,8 @@ double gpr_histogram_sum(gpr_histogram *h) { return h->sum; }
 | 
	
		
			
				|  |  |  double gpr_histogram_sum_of_squares(gpr_histogram *h) {
 | 
	
		
			
				|  |  |    return h->sum_of_squares;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const gpr_uint32 *gpr_histogram_get_contents(gpr_histogram *h, size_t *size) {
 | 
	
		
			
				|  |  | +  *size = h->num_buckets;
 | 
	
		
			
				|  |  | +  return h->buckets;
 | 
	
		
			
				|  |  | +}
 |