timer_deque_rs/timer_portable/
mod.rs

1/*-
2 * timer-deque-rs - a Rust crate which provides timer and timer queues based on target OS
3 *  functionality.
4 * 
5 * Copyright (C) 2025 Aleksandr Morozov alex@nixd.org
6 *  4neko.org alex@4neko.org
7 * 
8 * The timer-rs crate can be redistributed and/or modified
9 * under the terms of either of the following licenses:
10 *
11 *   1. the Mozilla Public License Version 2.0 (the “MPL”) OR
12 *                     
13 *   2. The MIT License (MIT)
14 *                     
15 *   3. EUROPEAN UNION PUBLIC LICENCE v. 1.2 EUPL © the European Union 2007, 2016
16 */
17
18/// A common code for the timer setup.
19pub mod timer;
20
21/// A common code for timer polling.
22pub mod poll;
23
24/// Linux specific code.
25#[cfg(target_os = "linux")]
26pub mod linux;
27
28
29
30/// BSD specific code (including OSX as it is compat).
31#[cfg(any(
32    target_os = "freebsd",
33    target_os = "dragonfly",
34    target_os = "netbsd",
35    target_os = "openbsd",
36    target_os = "macos",
37))]
38pub mod bsd;
39
40
41pub use timer::
42{
43    TimerFlags, 
44    TimerType, 
45    TimerSetTimeFlags, 
46    TimerReadRes, 
47    TimerExpMode, 
48    FdTimerCom, 
49    AbsoluteTime, 
50    RelativeTime,
51};
52
53pub use poll::{TimerPoll, PollEventType, PolledTimerFd, TimerPollOps};
54pub use timer::{TimerFd, FdTimerMarker};
55
56/// Error handling.
57pub mod portable_error
58{
59    use std::fmt;
60
61    use nix::errno::Errno;
62
63    /// An error description.
64    #[derive(Debug, Clone, PartialEq, Eq)]
65    pub struct TimerPortableErr
66    {
67        /// [Errno] error code
68        last_err: Errno,
69
70        /// Description
71        msg: String
72    }
73
74    impl fmt::Display for TimerPortableErr
75    {
76        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result 
77        {
78            write!(f, "errno: '{}', msg: '{}'", self.last_err, self.msg)
79        }
80    }
81
82    impl TimerPortableErr
83    {
84        pub 
85        fn new(last_err: Errno, msg: String) -> Self
86        {
87            return Self{ last_err: last_err, msg: msg };
88        }
89
90        pub 
91        fn get_errno(&self) -> Errno
92        {
93            return self.last_err;
94        }
95    }
96
97    /// A `type` for [Result].
98    pub type TimerPortResult<T> = Result<T, TimerPortableErr>;
99
100
101    #[macro_export]
102    macro_rules! portable_err 
103    {
104        ($last_err:expr,$($arg:tt)*) => (
105            return std::result::Result::Err( $crate::timer_portable::portable_error::TimerPortableErr::new($last_err, format!($($arg)*)) )
106        )
107    }
108
109    #[macro_export]
110    macro_rules! map_portable_err 
111    {
112        ($last_err:expr,$($arg:tt)*) => (
113            $crate::timer_portable::portable_error::TimerPortableErr::new($last_err, format!($($arg)*))
114        )
115    }
116}