mirror of
https://github.com/jiangcuo/nix.git
synced 2026-01-20 11:45:33 +00:00
Removed support for timerfd on Android as it seems to have been deprecated? See https://android.googlesource.com/platform/development/+/73a5a3b/ndk/platforms/android-20/include/sys/timerfd.h or https://github.com/rust-lang/libc/issues/1589 Removed the public status of `TimerSpec`, as it should not be exposed to the user. Implemented `FromRawFd` for `TimerFd` as it already implements `AsRawFd`. Addressed comments from the latest code review: - Removed upper bound assertions on timer expirations in tests. - Made the main example runnable and added code to show how to wait for the timer. - Refactored `ClockId` to use `libc_enum`. - Added comments for all public parts of the module. - Wrapped to 80 cols. - Changed the size of the buffer in the tests to the minimum required. * Ran rustfmt. * Added a `From` implementation for `libc::timespec` -> `TimeSpec`. * Reworked the example with the new changes and changed the timer from 5 to 1 second. * Added a constructor for a 0-initialized `TimerSpec`. * Added a new method to get the timer configured expiration (based on timerfd_gettime). * Added an helper method to unset the expiration of the timer. * Added a `wait` method to actually read from the timer. * Renamed `settime` into just `set`. * Refactored the tests and added a new one that tests both the `unset` and the `get` method. Modified CHANGELOG.
62 lines
1.5 KiB
Rust
62 lines
1.5 KiB
Rust
use nix::sys::time::{TimeSpec, TimeValLike};
|
|
use nix::sys::timerfd::{ClockId, Expiration, TimerFd, TimerFlags, TimerSetTimeFlags};
|
|
use std::time::Instant;
|
|
|
|
#[test]
|
|
pub fn test_timerfd_oneshot() {
|
|
let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap();
|
|
|
|
let before = Instant::now();
|
|
|
|
timer
|
|
.set(
|
|
Expiration::OneShot(TimeSpec::seconds(1)),
|
|
TimerSetTimeFlags::empty(),
|
|
)
|
|
.unwrap();
|
|
|
|
timer.wait().unwrap();
|
|
|
|
let millis = before.elapsed().as_millis();
|
|
assert!(millis > 900);
|
|
}
|
|
|
|
#[test]
|
|
pub fn test_timerfd_interval() {
|
|
let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap();
|
|
|
|
let before = Instant::now();
|
|
timer
|
|
.set(
|
|
Expiration::IntervalDelayed(TimeSpec::seconds(1), TimeSpec::seconds(2)),
|
|
TimerSetTimeFlags::empty(),
|
|
)
|
|
.unwrap();
|
|
|
|
timer.wait().unwrap();
|
|
|
|
let start_delay = before.elapsed().as_millis();
|
|
assert!(start_delay > 900);
|
|
|
|
timer.wait().unwrap();
|
|
|
|
let interval_delay = before.elapsed().as_millis();
|
|
assert!(interval_delay > 2900);
|
|
}
|
|
|
|
#[test]
|
|
pub fn test_timerfd_unset() {
|
|
let timer = TimerFd::new(ClockId::CLOCK_MONOTONIC, TimerFlags::empty()).unwrap();
|
|
|
|
timer
|
|
.set(
|
|
Expiration::OneShot(TimeSpec::seconds(1)),
|
|
TimerSetTimeFlags::empty(),
|
|
)
|
|
.unwrap();
|
|
|
|
timer.unset().unwrap();
|
|
|
|
assert!(timer.get().unwrap() == None);
|
|
}
|