From a69bcd885b5cf18ba05e0f81c091d3132534115c Mon Sep 17 00:00:00 2001 From: Sean Griffin Date: Wed, 2 Dec 2015 13:55:35 -0700 Subject: [PATCH 1/4] Ensure two `SystemTime`s are equal when nanos add to exactly 1B Currently if you add a duration which should lead to 0 nanos and 1 additional second, we end up with no additional seconds, and 1000000000 nanos. --- src/libstd/sys/unix/time.rs | 2 +- src/libstd/time/mod.rs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs index 75319ce962cc..cc026b8fd105 100644 --- a/src/libstd/sys/unix/time.rs +++ b/src/libstd/sys/unix/time.rs @@ -330,7 +330,7 @@ mod inner { // Nano calculations can't overflow because nanos are <1B which fit // in a u32. let mut nsec = other.subsec_nanos() + self.t.tv_nsec as u32; - if nsec > NSEC_PER_SEC as u32 { + if nsec >= NSEC_PER_SEC as u32 { nsec -= NSEC_PER_SEC as u32; secs = secs.checked_add(1).expect("overflow when adding \ duration to time"); diff --git a/src/libstd/time/mod.rs b/src/libstd/time/mod.rs index d400d12e23f4..1781461e3e3d 100644 --- a/src/libstd/time/mod.rs +++ b/src/libstd/time/mod.rs @@ -303,6 +303,10 @@ mod tests { let eighty_years = second * 60 * 60 * 24 * 365 * 80; assert_almost_eq!(a - eighty_years + eighty_years, a); assert_almost_eq!(a - (eighty_years * 10) + (eighty_years * 10), a); + + let one_second_from_epoch = UNIX_EPOCH + Duration::new(1, 0); + let one_second_from_epoch2 = UNIX_EPOCH + Duration::new(0, 999_999_999) + Duration::new(0, 1); + assert_eq!(one_second_from_epoch, one_second_from_epoch2); } #[test] From a59cd363cc77bbfb7ba95fb7a063577436fd533a Mon Sep 17 00:00:00 2001 From: Sean Griffin Date: Wed, 2 Dec 2015 15:01:58 -0700 Subject: [PATCH 2/4] Fixed make tidy error --- src/libstd/time/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libstd/time/mod.rs b/src/libstd/time/mod.rs index 1781461e3e3d..b7509cd3800d 100644 --- a/src/libstd/time/mod.rs +++ b/src/libstd/time/mod.rs @@ -305,7 +305,8 @@ mod tests { assert_almost_eq!(a - (eighty_years * 10) + (eighty_years * 10), a); let one_second_from_epoch = UNIX_EPOCH + Duration::new(1, 0); - let one_second_from_epoch2 = UNIX_EPOCH + Duration::new(0, 999_999_999) + Duration::new(0, 1); + let one_second_from_epoch2 = UNIX_EPOCH + Duration::new(0, 999_999_999) + + Duration::new(0, 1); assert_eq!(one_second_from_epoch, one_second_from_epoch2); } From 5dbc373f708fb203a354f2b6b08009c28d694244 Mon Sep 17 00:00:00 2001 From: Sean Griffin Date: Thu, 3 Dec 2015 08:27:32 -0700 Subject: [PATCH 3/4] Fix tests for SystemTime addition on mac and ios Those platforms don't support nanosecond precision, so adding 1 nanosecond does nothing. --- src/libstd/time/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/time/mod.rs b/src/libstd/time/mod.rs index b7509cd3800d..e3ce8e0de4b1 100644 --- a/src/libstd/time/mod.rs +++ b/src/libstd/time/mod.rs @@ -305,8 +305,8 @@ mod tests { assert_almost_eq!(a - (eighty_years * 10) + (eighty_years * 10), a); let one_second_from_epoch = UNIX_EPOCH + Duration::new(1, 0); - let one_second_from_epoch2 = UNIX_EPOCH + Duration::new(0, 999_999_999) - + Duration::new(0, 1); + let one_second_from_epoch2 = UNIX_EPOCH + Duration::new(0, 500_000_000) + + Duration::new(0, 500_000_000); assert_eq!(one_second_from_epoch, one_second_from_epoch2); } From 07471423a29bd4508a0552d4b9cfb104ca2a5928 Mon Sep 17 00:00:00 2001 From: Sean Griffin Date: Fri, 4 Dec 2015 09:49:35 -0700 Subject: [PATCH 4/4] Fix the time overflow on mac as well --- src/libstd/sys/unix/time.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs index cc026b8fd105..a07c30d96487 100644 --- a/src/libstd/sys/unix/time.rs +++ b/src/libstd/sys/unix/time.rs @@ -111,7 +111,7 @@ mod inner { // Nano calculations can't overflow because nanos are <1B which fit // in a u32. let mut usec = (other.subsec_nanos() / 1000) + self.t.tv_usec as u32; - if usec > USEC_PER_SEC as u32 { + if usec >= USEC_PER_SEC as u32 { usec -= USEC_PER_SEC as u32; secs = secs.checked_add(1).expect("overflow when adding \ duration to time");