@@ -36,13 +36,25 @@ fn SIGRTMAX() -> c_int {
36
36
unsafe { __libc_current_sigrtmax ( ) }
37
37
}
38
38
39
- /// Verifies that a signal number is valid.
39
+ /// Verifies that a signal number is valid when sent to a vCPU .
40
40
///
41
41
/// VCPU signals need to have values enclosed within the OS limits for realtime signals.
42
+ /// Returns either `Ok(num)` or `Err(EINVAL)`.
42
43
///
43
- /// Will return Ok(num) or Err(EINVAL).
44
- pub fn validate_vcpu_signal_num ( num : c_int ) -> io:: Result < c_int > {
45
- let actual_num = num + SIGRTMIN ( ) ;
44
+ /// # Arguments
45
+ ///
46
+ /// * `signum`: signal number.
47
+ ///
48
+ /// # Example
49
+ ///
50
+ /// ```
51
+ /// use sys_util::validate_vcpu_signal_num;
52
+ /// assert!(validate_vcpu_signal_num(0).is_ok());
53
+ /// assert!(validate_vcpu_signal_num(32).is_err());
54
+ /// ```
55
+ ///
56
+ pub fn validate_vcpu_signal_num ( signum : c_int ) -> io:: Result < c_int > {
57
+ let actual_num = signum + SIGRTMIN ( ) ;
46
58
if actual_num <= SIGRTMAX ( ) {
47
59
Ok ( actual_num)
48
60
} else {
@@ -54,6 +66,34 @@ pub fn validate_vcpu_signal_num(num: c_int) -> io::Result<c_int> {
54
66
///
55
67
/// This is considered unsafe because the given handler will be called asynchronously, interrupting
56
68
/// whatever the thread was doing and therefore must only do async-signal-safe operations.
69
+ ///
70
+ /// # Arguments
71
+ ///
72
+ /// * `signum`: signal number.
73
+ /// * `handler`: signal handler functor.
74
+ ///
75
+ /// # Example
76
+ ///
77
+ /// ```
78
+ /// extern crate libc;
79
+ /// extern crate sys_util;
80
+ ///
81
+ /// use libc::{c_int, c_void, raise, siginfo_t};
82
+ /// use sys_util::register_vcpu_signal_handler;
83
+ ///
84
+ /// extern "C" fn handle_signal(_: c_int, _: *mut siginfo_t, _: *mut c_void) {}
85
+ /// extern "C" { fn __libc_current_sigrtmin() -> c_int; }
86
+ ///
87
+ /// fn main() {
88
+ /// // Register dummy signal handler for `SIGRTMIN`.
89
+ /// assert!(unsafe { register_vcpu_signal_handler(0, handle_signal).is_ok() });
90
+ /// // Raise `SIGRTMIN`.
91
+ /// unsafe { raise(__libc_current_sigrtmin()); }
92
+ /// // Assert that the process is still alive.
93
+ /// assert!(true);
94
+ /// }
95
+ /// ```
96
+ ///
57
97
pub unsafe fn register_vcpu_signal_handler (
58
98
signum : c_int ,
59
99
handler : SignalHandler ,
@@ -67,6 +107,34 @@ pub unsafe fn register_vcpu_signal_handler(
67
107
}
68
108
69
109
/// Registers `handler` as the process' signal handler of `signum`.
110
+ ///
111
+ /// # Arguments
112
+ ///
113
+ /// * `signum`: signal number.
114
+ /// * `handler`: signal handler functor.
115
+ ///
116
+ /// # Example
117
+ ///
118
+ /// ```
119
+ /// extern crate libc;
120
+ /// extern crate sys_util;
121
+ ///
122
+ /// use std::sync::atomic::{AtomicBool, Ordering, ATOMIC_BOOL_INIT};
123
+ /// use libc::{c_int, c_void, raise, siginfo_t, SIGUSR1};
124
+ /// use sys_util::register_signal_handler;
125
+ ///
126
+ /// static HANDLER_CALLED: AtomicBool = ATOMIC_BOOL_INIT;
127
+ /// extern "C" fn handle_signal(_: c_int, _: *mut siginfo_t, _: *mut c_void) {
128
+ /// HANDLER_CALLED.store(true, Ordering::SeqCst);
129
+ /// }
130
+ ///
131
+ /// fn main() {
132
+ /// assert!(unsafe { register_signal_handler(SIGUSR1, handle_signal).is_ok() });
133
+ /// unsafe { raise(SIGUSR1); }
134
+ /// assert!(HANDLER_CALLED.load(Ordering::SeqCst));
135
+ /// }
136
+ /// ```
137
+ ///
70
138
pub fn register_signal_handler ( signum : c_int , handler : SignalHandler ) -> Result < ( ) , io:: Error > {
71
139
// Safe, because this is a POD struct.
72
140
let mut sigact: sigaction = unsafe { mem:: zeroed ( ) } ;
0 commit comments