diff options
| author | Steven Fackler <sfackler@gmail.com> | 2015-01-13 21:24:26 -0800 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2015-01-16 09:17:37 -0800 |
| commit | 08f6380a9f0b866796080094f44fe25ea5636547 (patch) | |
| tree | b07f1154c5095e48f96369ce9d37988e33ae3d71 /src/libstd/time | |
| parent | 3d5fbae33897a8340542f21b6ded913148ca9199 (diff) | |
Rewrite Condvar::wait_timeout and make it public
**The implementation is a direct adaptation of libcxx's condition_variable implementation.** pthread_cond_timedwait uses the non-monotonic system clock. It's possible to change the clock to a monotonic via pthread_cond_attr, but this is incompatible with static initialization. To deal with this, we calculate the timeout using the system clock, and maintain a separate record of the start and end times with a monotonic clock to be used for calculation of the return value.
Diffstat (limited to 'src/libstd/time')
| -rw-r--r-- | src/libstd/time/mod.rs | 68 |
1 files changed, 2 insertions, 66 deletions
diff --git a/src/libstd/time/mod.rs b/src/libstd/time/mod.rs index d6c94f27a8b..f62571942a7 100644 --- a/src/libstd/time/mod.rs +++ b/src/libstd/time/mod.rs @@ -10,7 +10,7 @@ //! Temporal quantification. -use libc; +use sys::time::SteadyTime; pub use self::duration::Duration; @@ -20,69 +20,5 @@ pub mod duration; /// in nanoseconds since an unspecified epoch. // NB: this is intentionally not public, this is not ready to stabilize its api. fn precise_time_ns() -> u64 { - return os_precise_time_ns(); - - #[cfg(windows)] - fn os_precise_time_ns() -> u64 { - let mut ticks_per_s = 0; - assert_eq!(unsafe { - libc::QueryPerformanceFrequency(&mut ticks_per_s) - }, 1); - let ticks_per_s = if ticks_per_s == 0 {1} else {ticks_per_s}; - let mut ticks = 0; - assert_eq!(unsafe { - libc::QueryPerformanceCounter(&mut ticks) - }, 1); - - return (ticks as u64 * 1000000000) / (ticks_per_s as u64); - } - - #[cfg(any(target_os = "macos", target_os = "ios"))] - fn os_precise_time_ns() -> u64 { - use sync; - - static mut TIMEBASE: libc::mach_timebase_info = libc::mach_timebase_info { numer: 0, - denom: 0 }; - static ONCE: sync::Once = sync::ONCE_INIT; - unsafe { - ONCE.call_once(|| { - imp::mach_timebase_info(&mut TIMEBASE); - }); - let time = imp::mach_absolute_time(); - time * TIMEBASE.numer as u64 / TIMEBASE.denom as u64 - } - } - - #[cfg(not(any(windows, target_os = "macos", target_os = "ios")))] - fn os_precise_time_ns() -> u64 { - let mut ts = libc::timespec { tv_sec: 0, tv_nsec: 0 }; - unsafe { - imp::clock_gettime(libc::CLOCK_MONOTONIC, &mut ts); - } - return (ts.tv_sec as u64) * 1000000000 + (ts.tv_nsec as u64) - } -} - -#[cfg(all(unix, not(target_os = "macos"), not(target_os = "ios")))] -mod imp { - use libc::{c_int, timespec}; - - // Apparently android provides this in some other library? - #[cfg(not(target_os = "android"))] - #[link(name = "rt")] - extern {} - - extern { - pub fn clock_gettime(clk_id: c_int, tp: *mut timespec) -> c_int; - } - -} -#[cfg(any(target_os = "macos", target_os = "ios"))] -mod imp { - use libc::{c_int, mach_timebase_info}; - - extern { - pub fn mach_absolute_time() -> u64; - pub fn mach_timebase_info(info: *mut mach_timebase_info) -> c_int; - } + SteadyTime::now().ns() } |
