replace broken shuteye with libc

This commit is contained in:
Simon Wörner
2017-04-03 14:16:30 +00:00
parent d4491f7dc1
commit 5f61004406
3 changed files with 31 additions and 10 deletions

View File

@@ -1,6 +1,6 @@
#![feature(step_by)]
extern crate argparse;
extern crate shuteye;
extern crate libc;
extern crate time;
use std::io::prelude::*;
@@ -9,9 +9,36 @@ use std::path::Path;
use std::time::Duration;
use argparse::{ArgumentParser, Print, Store};
use shuteye::sleep;
use libc::{c_long, clock_nanosleep, time_t, timespec};
use time::precise_time_ns;
const CLOCK_MONOTONIC: i32 = 1;
pub fn sleep(duration: Duration) -> Option<Duration> {
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)
}