|  | @@ -80,103 +80,67 @@ gpr_timespec gpr_inf_past(gpr_clock_type type) {
 | 
	
		
			
				|  |  |    return out;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/* TODO(ctiller): consider merging _nanos, _micros, _millis into a single
 | 
	
		
			
				|  |  | -   function for maintainability. Similarly for _seconds, _minutes, and _hours */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -gpr_timespec gpr_time_from_nanos(int64_t ns, gpr_clock_type type) {
 | 
	
		
			
				|  |  | -  gpr_timespec result;
 | 
	
		
			
				|  |  | -  result.clock_type = type;
 | 
	
		
			
				|  |  | -  if (ns == INT64_MAX) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_future(type);
 | 
	
		
			
				|  |  | -  } else if (ns == INT64_MIN) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_past(type);
 | 
	
		
			
				|  |  | -  } else if (ns >= 0) {
 | 
	
		
			
				|  |  | -    result.tv_sec = ns / GPR_NS_PER_SEC;
 | 
	
		
			
				|  |  | -    result.tv_nsec = (int32_t)(ns - result.tv_sec * GPR_NS_PER_SEC);
 | 
	
		
			
				|  |  | +static gpr_timespec to_seconds_from_sub_second_time(int64_t time_in_units,
 | 
	
		
			
				|  |  | +                                                    int64_t units_per_sec,
 | 
	
		
			
				|  |  | +                                                    gpr_clock_type type) {
 | 
	
		
			
				|  |  | +  gpr_timespec out;
 | 
	
		
			
				|  |  | +  if (time_in_units == INT64_MAX) {
 | 
	
		
			
				|  |  | +    out = gpr_inf_future(type);
 | 
	
		
			
				|  |  | +  } else if (time_in_units == INT64_MIN) {
 | 
	
		
			
				|  |  | +    out = gpr_inf_past(type);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    /* Calculation carefully formulated to avoid any possible under/overflow. */
 | 
	
		
			
				|  |  | -    result.tv_sec = (-(999999999 - (ns + GPR_NS_PER_SEC)) / GPR_NS_PER_SEC) - 1;
 | 
	
		
			
				|  |  | -    result.tv_nsec = (int32_t)(ns - result.tv_sec * GPR_NS_PER_SEC);
 | 
	
		
			
				|  |  | +    if (time_in_units >= 0) {
 | 
	
		
			
				|  |  | +      out.tv_sec = time_in_units / units_per_sec;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      out.tv_sec = (-((units_per_sec - 1) - (time_in_units + units_per_sec)) /
 | 
	
		
			
				|  |  | +                    units_per_sec) -
 | 
	
		
			
				|  |  | +                   1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    out.tv_nsec = (int32_t)((time_in_units - out.tv_sec * units_per_sec) *
 | 
	
		
			
				|  |  | +                            GPR_NS_PER_SEC / units_per_sec);
 | 
	
		
			
				|  |  | +    out.clock_type = type;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  | +  return out;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type type) {
 | 
	
		
			
				|  |  | -  gpr_timespec result;
 | 
	
		
			
				|  |  | -  result.clock_type = type;
 | 
	
		
			
				|  |  | -  if (us == INT64_MAX) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_future(type);
 | 
	
		
			
				|  |  | -  } else if (us == INT64_MIN) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_past(type);
 | 
	
		
			
				|  |  | -  } else if (us >= 0) {
 | 
	
		
			
				|  |  | -    result.tv_sec = us / 1000000;
 | 
	
		
			
				|  |  | -    result.tv_nsec = (int32_t)((us - result.tv_sec * 1000000) * 1000);
 | 
	
		
			
				|  |  | +static gpr_timespec to_seconds_from_above_second_time(int64_t time_in_units,
 | 
	
		
			
				|  |  | +                                                      int64_t secs_per_unit,
 | 
	
		
			
				|  |  | +                                                      gpr_clock_type type) {
 | 
	
		
			
				|  |  | +  gpr_timespec out;
 | 
	
		
			
				|  |  | +  if (time_in_units >= INT64_MAX / secs_per_unit) {
 | 
	
		
			
				|  |  | +    out = gpr_inf_future(type);
 | 
	
		
			
				|  |  | +  } else if (time_in_units <= INT64_MIN / secs_per_unit) {
 | 
	
		
			
				|  |  | +    out = gpr_inf_past(type);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    /* Calculation carefully formulated to avoid any possible under/overflow. */
 | 
	
		
			
				|  |  | -    result.tv_sec = (-(999999 - (us + 1000000)) / 1000000) - 1;
 | 
	
		
			
				|  |  | -    result.tv_nsec = (int32_t)((us - result.tv_sec * 1000000) * 1000);
 | 
	
		
			
				|  |  | +    out.tv_sec = time_in_units * secs_per_unit;
 | 
	
		
			
				|  |  | +    out.tv_nsec = 0;
 | 
	
		
			
				|  |  | +    out.clock_type = type;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  | +  return out;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +gpr_timespec gpr_time_from_nanos(int64_t ns, gpr_clock_type type) {
 | 
	
		
			
				|  |  | +  return to_seconds_from_sub_second_time(ns, GPR_NS_PER_SEC, type);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type type) {
 | 
	
		
			
				|  |  | +  return to_seconds_from_sub_second_time(us, GPR_US_PER_SEC, type);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  gpr_timespec gpr_time_from_millis(int64_t ms, gpr_clock_type type) {
 | 
	
		
			
				|  |  | -  gpr_timespec result;
 | 
	
		
			
				|  |  | -  result.clock_type = type;
 | 
	
		
			
				|  |  | -  if (ms == INT64_MAX) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_future(type);
 | 
	
		
			
				|  |  | -  } else if (ms == INT64_MIN) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_past(type);
 | 
	
		
			
				|  |  | -  } else if (ms >= 0) {
 | 
	
		
			
				|  |  | -    result.tv_sec = ms / 1000;
 | 
	
		
			
				|  |  | -    result.tv_nsec = (int32_t)((ms - result.tv_sec * 1000) * 1000000);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    /* Calculation carefully formulated to avoid any possible under/overflow. */
 | 
	
		
			
				|  |  | -    result.tv_sec = (-(999 - (ms + 1000)) / 1000) - 1;
 | 
	
		
			
				|  |  | -    result.tv_nsec = (int32_t)((ms - result.tv_sec * 1000) * 1000000);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  | +  return to_seconds_from_sub_second_time(ms, GPR_MS_PER_SEC, type);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type type) {
 | 
	
		
			
				|  |  | -  gpr_timespec result;
 | 
	
		
			
				|  |  | -  result.clock_type = type;
 | 
	
		
			
				|  |  | -  if (s == INT64_MAX) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_future(type);
 | 
	
		
			
				|  |  | -  } else if (s == INT64_MIN) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_past(type);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    result.tv_sec = s;
 | 
	
		
			
				|  |  | -    result.tv_nsec = 0;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  | +  return to_seconds_from_sub_second_time(s, 1, type);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  gpr_timespec gpr_time_from_minutes(int64_t m, gpr_clock_type type) {
 | 
	
		
			
				|  |  | -  gpr_timespec result;
 | 
	
		
			
				|  |  | -  result.clock_type = type;
 | 
	
		
			
				|  |  | -  if (m >= INT64_MAX / 60) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_future(type);
 | 
	
		
			
				|  |  | -  } else if (m <= INT64_MIN / 60) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_past(type);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    result.tv_sec = m * 60;
 | 
	
		
			
				|  |  | -    result.tv_nsec = 0;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  | +  return to_seconds_from_above_second_time(m, 60, type);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  gpr_timespec gpr_time_from_hours(int64_t h, gpr_clock_type type) {
 | 
	
		
			
				|  |  | -  gpr_timespec result;
 | 
	
		
			
				|  |  | -  result.clock_type = type;
 | 
	
		
			
				|  |  | -  if (h >= INT64_MAX / 3600) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_future(type);
 | 
	
		
			
				|  |  | -  } else if (h <= INT64_MIN / 3600) {
 | 
	
		
			
				|  |  | -    result = gpr_inf_past(type);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    result.tv_sec = h * 3600;
 | 
	
		
			
				|  |  | -    result.tv_nsec = 0;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return result;
 | 
	
		
			
				|  |  | +  return to_seconds_from_above_second_time(h, 3600, type);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b) {
 |