1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/// Get overrun count for a per-process timer.
///
/// # Examples
///
/// ```
/// const TIMER_SIG: i32 = nc::SIGRTMAX;
///
/// fn handle_alarm(signum: i32) {
/// assert_eq!(signum, TIMER_SIG);
/// }
///
/// fn main() {
/// let sa = nc::new_sigaction(handle_alarm);
/// let ret = unsafe { nc::rt_sigaction(TIMER_SIG, Some(&sa), None) };
/// assert!(ret.is_ok());
///
/// let tid = nc::itimerspec_t {
/// it_interval: nc::timespec_t::default(),
/// it_value: nc::timespec_t {
/// tv_sec: 1,
/// tv_nsec: 0,
/// },
/// };
/// let mut ev = nc::sigevent_t {
/// sigev_value: nc::sigval_t {
/// sival_ptr: &tid as *const nc::itimerspec_t as usize,
/// },
/// sigev_signo: TIMER_SIG,
/// sigev_notify: nc::SIGEV_SIGNAL,
/// sigev_un: nc::sigev_un_t::default(),
/// };
/// let mut timer_id = nc::timer_t::default();
/// let ret = unsafe { nc::timer_create(nc::CLOCK_MONOTONIC, Some(&mut ev), &mut timer_id) };
/// assert!(ret.is_ok());
/// println!("timer id: {:?}", timer_id);
///
/// let flags = 0;
/// let time = nc::itimerspec_t {
/// it_interval: nc::timespec_t::default(),
/// it_value: nc::timespec_t {
/// tv_sec: 1,
/// tv_nsec: 0,
/// },
/// };
/// let ret = unsafe { nc::timer_settime(timer_id, flags, &time, None) };
/// assert!(ret.is_ok());
///
/// let mut cur_time = nc::itimerspec_t::default();
/// let ret = unsafe { nc::timer_gettime(timer_id, &mut cur_time) };
/// assert!(ret.is_ok());
/// println!("cur time: {:?}", cur_time);
///
/// let mask = nc::sigset_t::default();
/// let _ret = unsafe { nc::rt_sigsuspend(&mask) };
///
/// let ret = unsafe { nc::timer_getoverrun(timer_id) };
/// assert!(ret.is_ok());
/// assert_eq!(ret, Ok(0));
///
/// let ret = unsafe { nc::timer_delete(timer_id) };
/// assert!(ret.is_ok());
/// }
/// ```
pub unsafe fn timer_getoverrun(timer_id: timer_t) -> Result<i32, Errno> {
let timer_id = timer_id as usize;
syscall1(SYS_TIMER_GETOVERRUN, timer_id).map(|ret| ret as i32)
}