| 
					
				 | 
			
			
				@@ -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( 
			 |