gpr_timespec gpr_backoff_step(gpr_backoff *backoff, gpr_timespec now) { double new_timeout_millis = backoff->multiplier * (double)backoff->current_timeout_millis; double jitter_range = backoff->jitter * new_timeout_millis; double jitter = (2 * generate_uniform_random_number(&backoff->rng_state) - 1) * jitter_range; backoff->current_timeout_millis = GPR_CLAMP((int64_t)(new_timeout_millis + jitter), backoff->min_timeout_millis, backoff->max_timeout_millis); return gpr_time_add( now, gpr_time_from_millis(backoff->current_timeout_millis, GPR_TIMESPAN)); }
gpr_timespec gpr_backoff_step(gpr_backoff *backoff, gpr_timespec now) { const double new_timeout_millis = backoff->multiplier * (double)backoff->current_timeout_millis; backoff->current_timeout_millis = GPR_MIN((int64_t)new_timeout_millis, backoff->max_timeout_millis); const double jitter_range_width = backoff->jitter * new_timeout_millis; const double jitter = (2 * generate_uniform_random_number(&backoff->rng_state) - 1) * jitter_range_width; backoff->current_timeout_millis = (int64_t)((double)(backoff->current_timeout_millis) + jitter); const gpr_timespec current_deadline = gpr_time_add( now, gpr_time_from_millis(backoff->current_timeout_millis, GPR_TIMESPAN)); const gpr_timespec min_deadline = gpr_time_add( now, gpr_time_from_millis(backoff->min_timeout_millis, GPR_TIMESPAN)); return gpr_time_max(current_deadline, min_deadline); }