From c8914f364ce2c22dc3d56147c499bfa4d6d3a359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=B6rner?= Date: Mon, 3 Apr 2017 16:41:51 +0200 Subject: [PATCH] moved sleep function to lib.rs --- V2/sleep/src/lib.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ V2/sleep/src/main.rs | 31 ++----------------------------- 2 files changed, 44 insertions(+), 29 deletions(-) create mode 100644 V2/sleep/src/lib.rs diff --git a/V2/sleep/src/lib.rs b/V2/sleep/src/lib.rs new file mode 100644 index 0000000..77b6231 --- /dev/null +++ b/V2/sleep/src/lib.rs @@ -0,0 +1,42 @@ +extern crate libc; + +use std::time::Duration; +use libc::{c_int, c_long, time_t, timespec}; + +const CLOCK_MONOTONIC: i32 = 1; + +#[cfg(target_os = "linux")] +fn clock_nanosleep(clk_id: libc::clockid_t, flags: libc::c_int, rqtp: *const libc::timespec, rmtp: *mut libc::timespec) -> libc::c_int { + unsafe { libc::clock_nanosleep(clk_id, flags, rqtp as *const _, rmtp as *mut _) } +} + +#[cfg(target_os = "macos")] +fn clock_nanosleep(_clk_id: libc::c_int, _flags: libc::c_int, rqtp: *const libc::timespec, rmtp: *mut libc::timespec) -> libc::c_int { + unsafe { libc::nanosleep(rqtp as *const _, rmtp as *mut _) } +} + +pub fn sleep(duration: Duration) -> Result { + let ts = duration_to_timespec(duration); + let mut remain = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let ret = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &mut remain); + + if ret == 0 { + Ok(timespec_to_duration(remain)) + } else { + Err(ret) + } +} + +fn duration_to_timespec(duration: Duration) -> timespec { + timespec { + tv_sec: duration.as_secs() as time_t, + tv_nsec: duration.subsec_nanos() as c_long, + } +} + +fn timespec_to_duration(timespec: timespec) -> Duration { + Duration::new(timespec.tv_sec as u64, timespec.tv_nsec as u32) +} diff --git a/V2/sleep/src/main.rs b/V2/sleep/src/main.rs index de3fc28..06c8a23 100644 --- a/V2/sleep/src/main.rs +++ b/V2/sleep/src/main.rs @@ -1,6 +1,6 @@ #![feature(step_by)] extern crate argparse; -extern crate libc; +extern crate sleep; extern crate time; use std::io::prelude::*; @@ -9,36 +9,9 @@ use std::path::Path; use std::time::Duration; use argparse::{ArgumentParser, Print, Store}; -use libc::{c_long, clock_nanosleep, time_t, timespec}; +use sleep::sleep; use time::precise_time_ns; -const CLOCK_MONOTONIC: i32 = 1; - -pub fn sleep(duration: Duration) -> Option { - let ts = duration_to_timespec(duration); - let mut remain = timespec { - tv_sec: 0, - tv_nsec: 0, - }; - let ret = unsafe { clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &mut remain) }; - println!("ret = {}", ret); - if remain.tv_nsec == 0 && remain.tv_sec == 0 { - return None; - } - Some(timespec_to_duration(remain)) -} - -fn duration_to_timespec(duration: Duration) -> timespec { - timespec { - tv_sec: duration.as_secs() as time_t, - tv_nsec: duration.subsec_nanos() as c_long, - } -} - -fn timespec_to_duration(timespec: timespec) -> Duration { - Duration::new(timespec.tv_sec as u64, timespec.tv_nsec as u32) -} - fn duration_from_ns(duration_ns: u64) -> Duration { Duration::new(duration_ns / 1_000_000_000, (duration_ns % 1_000_000_000) as u32) }