Skip to content

Commit

Permalink
Update sys::time impls to have checked_sub_instant
Browse files Browse the repository at this point in the history
  • Loading branch information
faern committed Mar 22, 2019
1 parent d56b1fd commit 1ccad16
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 25 deletions.
8 changes: 3 additions & 5 deletions src/libstd/sys/cloudabi/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,9 @@ impl Instant {
Instant { t: 0 }
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
let diff = self.t
.checked_sub(other.t)
.expect("second instant is later than self");
Duration::new(diff / NSEC_PER_SEC, (diff % NSEC_PER_SEC) as u32)
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
let diff = self.t.checked_sub(other.t)?;
Some(Duration::new(diff / NSEC_PER_SEC, (diff % NSEC_PER_SEC) as u32))
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down
6 changes: 2 additions & 4 deletions src/libstd/sys/redox/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,8 @@ impl Instant {
false
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
self.t.sub_timespec(&other.t).unwrap_or_else(|_| {
panic!("specified instant was later than self")
})
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
self.t.sub_timespec(&other.t).ok()
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down
4 changes: 2 additions & 2 deletions src/libstd/sys/sgx/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ impl Instant {
Instant(usercalls::insecure_time())
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
self.0 - other.0
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
self.0.checked_sub(other.0)
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down
13 changes: 5 additions & 8 deletions src/libstd/sys/unix/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,12 +149,11 @@ mod inner {
true
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
let diff = self.t.checked_sub(other.t)?;
let info = info();
let diff = self.t.checked_sub(other.t)
.expect("second instant is later than self");
let nanos = mul_div_u64(diff, info.numer as u64, info.denom as u64);
Duration::new(nanos / NSEC_PER_SEC, (nanos % NSEC_PER_SEC) as u32)
Some(Duration::new(nanos / NSEC_PER_SEC, (nanos % NSEC_PER_SEC) as u32))
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down Expand Up @@ -285,10 +284,8 @@ mod inner {
false // last clause, used so `||` is always trailing above
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
self.t.sub_timespec(&other.t).unwrap_or_else(|_| {
panic!("specified instant was later than self")
})
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
self.t.sub_timespec(&other.t).ok()
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down
4 changes: 2 additions & 2 deletions src/libstd/sys/wasm/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ impl Instant {
false
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
self.0 - other.0
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
self.0.checked_sub(other.0)
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down
8 changes: 4 additions & 4 deletions src/libstd/sys/windows/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,17 @@ impl Instant {
Instant { t: Duration::from_secs(0) }
}

pub fn sub_instant(&self, other: &Instant) -> Duration {
pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> {
// On windows there's a threshold below which we consider two timestamps
// equivalent due to measurement error. For more details + doc link,
// check the docs on epsilon.
let epsilon =
perf_counter::PerformanceCounterInstant::epsilon();
if other.t > self.t && other.t - self.t <= epsilon {
return Duration::new(0, 0)
Some(Duration::new(0, 0))
} else {
self.t.checked_sub(other.t)
}
self.t.checked_sub(other.t)
.expect("specified instant was later than self")
}

pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> {
Expand Down

0 comments on commit 1ccad16

Please sign in to comment.