Index: base/time/time.cc |
diff --git a/base/time/time.cc b/base/time/time.cc |
index ce9d12c0c2e5885c10b6a5ff08715ffc0bcf5ca5..951f7ba9e0a18d75963d364c149cf738d10663e4 100644 |
--- a/base/time/time.cc |
+++ b/base/time/time.cc |
@@ -274,6 +274,22 @@ TimeTicks TimeTicks::UnixEpoch() { |
return leaky_unix_epoch_singleton_instance.Get().unix_epoch(); |
} |
+TimeTicks TimeTicks::SnappedToNextTick(TimeTicks tick_phase, |
+ TimeDelta tick_interval) const { |
+ // |interval_offset| is the offset from |this| to the next multiple of |
+ // |tick_interval| after |tick_phase|, possibly negative if in the past. |
+ TimeDelta interval_offset = TimeDelta::FromInternalValue( |
+ (tick_phase - *this).ToInternalValue() % tick_interval.ToInternalValue()); |
+ // If |this| is exactly on the interval (i.e. offset==0), don't adjust. |
+ // Otherwise, if |tick_phase| was in the past, adjust forward to the next |
+ // tick after |this|. |
+ if (interval_offset.ToInternalValue() != 0 && tick_phase < *this) { |
+ interval_offset += tick_interval; |
+ } |
+ |
+ return *this + interval_offset; |
+} |
+ |
std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks) { |
// This function formats a TimeTicks object as "bogo-microseconds". |
// The origin and granularity of the count are platform-specific, and may very |