Skip to content

Commit

Permalink
[Windows] Work around non-monotonic clocks in the self-profiler
Browse files Browse the repository at this point in the history
On Windows, the high-resolution timestamp api doesn't seem to always be
monotonic. This can cause panics when the self-profiler uses the
`Instant` api to find elapsed time.

Work around this by detecting the case where now is less than the start
time and just use 0 elapsed ticks as the measurement.

Fixes rust-lang#51648
  • Loading branch information
wesleywiser committed Nov 25, 2018
1 parent b319715 commit dce1c45
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions src/librustc/util/profiling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use session::config::Options;

use std::fs;
use std::io::{self, StdoutLock, Write};
use std::time::Instant;
use std::time::{Duration, Instant};

macro_rules! define_categories {
($($name:ident,)*) => {
Expand Down Expand Up @@ -197,7 +197,20 @@ impl SelfProfiler {
}

fn stop_timer(&mut self) -> u64 {
let elapsed = self.current_timer.elapsed();
let elapsed = if cfg!(windows) {
// On Windows, timers don't always appear to be monotonic (see #51648)
// which can lead to panics when calculating elapsed time.
// Work around this by testing to see if the current time is less than
// our recorded time, and if it is, just returning 0.
let now = Instant::now();
if self.current_timer >= now {
Duration::new(0, 0)
} else {
self.current_timer.elapsed()
}
} else {
self.current_timer.elapsed()
};

self.current_timer = Instant::now();

Expand Down

0 comments on commit dce1c45

Please sign in to comment.