// Copyright 2020 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use crate::{ AsRawDescriptor, FakeClock, FromRawDescriptor, IntoRawDescriptor, RawDescriptor, Result, }; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; use std::sync::Arc; use std::time::Duration; use sync::Mutex; use sys_util::{FakeTimerFd, TimerFd}; /// See [TimerFd](sys_util::TimerFd) for struct- and method-level /// documentation. pub struct Timer(pub TimerFd); impl Timer { pub fn new() -> Result { TimerFd::new().map(Timer) } } /// See [FakeTimerFd](sys_util::FakeTimerFd) for struct- and method-level /// documentation. pub struct FakeTimer(FakeTimerFd); impl FakeTimer { pub fn new(clock: Arc>) -> Self { FakeTimer(FakeTimerFd::new(clock)) } } macro_rules! build_timer { ($timer:ident, $inner:ident) => { impl $timer { pub fn reset(&mut self, dur: Duration, interval: Option) -> Result<()> { self.0.reset(dur, interval) } pub fn wait(&mut self) -> Result<()> { self.0.wait().map(|_| ()) } pub fn is_armed(&self) -> Result { self.0.is_armed() } pub fn clear(&mut self) -> Result<()> { self.0.clear() } pub fn resolution() -> Result { $inner::resolution() } } impl AsRawDescriptor for $timer { fn as_raw_descriptor(&self) -> RawDescriptor { self.0.as_raw_fd() } } impl IntoRawDescriptor for $timer { fn into_raw_descriptor(self) -> RawDescriptor { self.0.into_raw_fd() } } }; } build_timer!(Timer, TimerFd); build_timer!(FakeTimer, FakeTimerFd); impl FromRawDescriptor for Timer { unsafe fn from_raw_descriptor(descriptor: RawDescriptor) -> Self { Timer(TimerFd::from_raw_fd(descriptor)) } }