Implement the same optimization in windows/time
This commit is contained in:
parent
59c06e9e40
commit
4f37220510
@ -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;
|
||||
@ -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);
|
||||
|
||||
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
|
||||
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 {
|
||||
cvt(c::QueryPerformanceFrequency(&mut frequency)).unwrap();
|
||||
}
|
||||
|
||||
FREQUENCY.store(frequency as u64, Ordering::Relaxed);
|
||||
frequency
|
||||
}
|
||||
|
||||
fn query() -> c::LARGE_INTEGER {
|
||||
|
Loading…
x
Reference in New Issue
Block a user