|  | @@ -73,20 +73,9 @@ bool grpc_server_retry_throttle_data_record_failure(
 | 
	
		
			
				|  |  |    // First, check if we are stale and need to be replaced.
 | 
	
		
			
				|  |  |    get_replacement_throttle_data_if_needed(&throttle_data);
 | 
	
		
			
				|  |  |    // We decrement milli_tokens by 1000 (1 token) for each failure.
 | 
	
		
			
				|  |  | -  const int delta = -1000;
 | 
	
		
			
				|  |  | -  const int old_value = (int)gpr_atm_full_fetch_add(
 | 
	
		
			
				|  |  | -      &throttle_data->milli_tokens, (gpr_atm)delta);
 | 
	
		
			
				|  |  | -  // If the above change takes us below 0, then re-add the excess.  Note
 | 
	
		
			
				|  |  | -  // that between these two atomic operations, the value will be
 | 
	
		
			
				|  |  | -  // artificially low by as much as 1000, but this window should be
 | 
	
		
			
				|  |  | -  // brief.
 | 
	
		
			
				|  |  | -  int new_value = old_value - 1000;
 | 
	
		
			
				|  |  | -  if (new_value < 0) {
 | 
	
		
			
				|  |  | -    const int excess_value = new_value - (old_value < 0 ? old_value : 0);
 | 
	
		
			
				|  |  | -    gpr_atm_full_fetch_add(&throttle_data->milli_tokens,
 | 
	
		
			
				|  |  | -                           (gpr_atm)-excess_value);
 | 
	
		
			
				|  |  | -    new_value = 0;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  const int new_value = (int)gpr_atm_no_barrier_clamped_add(
 | 
	
		
			
				|  |  | +      &throttle_data->milli_tokens, (gpr_atm)-1000, (gpr_atm)0,
 | 
	
		
			
				|  |  | +      (gpr_atm)throttle_data->max_milli_tokens);
 | 
	
		
			
				|  |  |    // Retries are allowed as long as the new value is above the threshold
 | 
	
		
			
				|  |  |    // (max_milli_tokens / 2).
 | 
	
		
			
				|  |  |    return new_value > throttle_data->max_milli_tokens / 2;
 | 
	
	
		
			
				|  | @@ -97,22 +86,9 @@ void grpc_server_retry_throttle_data_record_success(
 | 
	
		
			
				|  |  |    // First, check if we are stale and need to be replaced.
 | 
	
		
			
				|  |  |    get_replacement_throttle_data_if_needed(&throttle_data);
 | 
	
		
			
				|  |  |    // We increment milli_tokens by milli_token_ratio for each success.
 | 
	
		
			
				|  |  | -  const int delta = throttle_data->milli_token_ratio;
 | 
	
		
			
				|  |  | -  const int old_value = (int)gpr_atm_full_fetch_add(
 | 
	
		
			
				|  |  | -      &throttle_data->milli_tokens, (gpr_atm)delta);
 | 
	
		
			
				|  |  | -  // If the above change takes us over max_milli_tokens, then subtract
 | 
	
		
			
				|  |  | -  // the excess.  Note that between these two atomic operations, the
 | 
	
		
			
				|  |  | -  // value will be artificially high by as much as milli_token_ratio,
 | 
	
		
			
				|  |  | -  // but this window should be brief.
 | 
	
		
			
				|  |  | -  const int new_value = old_value + throttle_data->milli_token_ratio;
 | 
	
		
			
				|  |  | -  if (new_value > throttle_data->max_milli_tokens) {
 | 
	
		
			
				|  |  | -    const int excess_value =
 | 
	
		
			
				|  |  | -        new_value - (old_value > throttle_data->max_milli_tokens
 | 
	
		
			
				|  |  | -                         ? old_value
 | 
	
		
			
				|  |  | -                         : throttle_data->max_milli_tokens);
 | 
	
		
			
				|  |  | -    gpr_atm_full_fetch_add(&throttle_data->milli_tokens,
 | 
	
		
			
				|  |  | -                           (gpr_atm)-excess_value);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  gpr_atm_no_barrier_clamped_add(
 | 
	
		
			
				|  |  | +      &throttle_data->milli_tokens, (gpr_atm)throttle_data->milli_token_ratio,
 | 
	
		
			
				|  |  | +      (gpr_atm)0, (gpr_atm)throttle_data->max_milli_tokens);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_ref(
 |