Skip to content

Commit

Permalink
Implement the same optimization in windows/time
Browse files Browse the repository at this point in the history
  • Loading branch information
thomcc committed Oct 9, 2020
1 parent 59c06e9 commit 4f37220
Showing 1 changed file with 17 additions and 19 deletions.
36 changes: 17 additions & 19 deletions library/std/src/sys/windows/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ fn intervals2dur(intervals: u64) -> Duration {

mod perf_counter {
use super::NANOS_PER_SEC;
use crate::sync::atomic::{AtomicUsize, Ordering::SeqCst};
use crate::sync::atomic::{AtomicU64, Ordering};
use crate::sys::c;
use crate::sys::cvt;
use crate::sys_common::mul_div_u64;
Expand Down Expand Up @@ -197,27 +197,25 @@ mod perf_counter {
}

fn frequency() -> c::LARGE_INTEGER {
static mut FREQUENCY: c::LARGE_INTEGER = 0;
static STATE: AtomicUsize = AtomicUsize::new(0);

// Either the cached result of `QueryPerformanceFrequency` or `0` for
// uninitialized. Storing this as a single `AtomicU64` allows us to use
// `Relaxed` operations, as we are only interested in the effects on a
// single memory location.
static FREQUENCY: AtomicU64 = AtomicU64::new(0);

let cached = FREQUENCY.load(Ordering::Relaxed);
// If a previous thread has filled in this global state, use that.
if cached != 0 {
return cached as c::LARGE_INTEGER;
}
// ... otherwise learn for ourselves ...
let mut frequency = 0;
unsafe {
// If a previous thread has filled in this global state, use that.
if STATE.load(SeqCst) == 2 {
return FREQUENCY;
}

// ... otherwise learn for ourselves ...
let mut frequency = 0;
cvt(c::QueryPerformanceFrequency(&mut frequency)).unwrap();

// ... and attempt to be the one thread that stores it globally for
// all other threads
if STATE.compare_exchange(0, 1, SeqCst, SeqCst).is_ok() {
FREQUENCY = frequency;
STATE.store(2, SeqCst);
}
frequency
}

FREQUENCY.store(frequency as u64, Ordering::Relaxed);
frequency
}

fn query() -> c::LARGE_INTEGER {
Expand Down

0 comments on commit 4f37220

Please sign in to comment.