Skip to content

Commit 8698588

Browse files
committed
Add SigSet::extend and SigSet::clear.
1 parent 0210e30 commit 8698588

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

src/sys/signal.rs

+37
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,27 @@ impl SigSet {
9292
Errno::result(res).map(drop)
9393
}
9494

95+
pub fn clear(&mut self) -> Result<()> {
96+
let res = unsafe { libc::sigemptyset(&mut self.sigset as *mut libc::sigset_t) };
97+
98+
Errno::result(res).map(drop)
99+
}
100+
95101
pub fn remove(&mut self, signum: SigNum) -> Result<()> {
96102
let res = unsafe { libc::sigdelset(&mut self.sigset as *mut libc::sigset_t, signum) };
97103

98104
Errno::result(res).map(drop)
99105
}
100106

107+
pub fn extend(&mut self, other: &SigSet) -> Result<()> {
108+
for i in 1..NSIG {
109+
if try!(other.contains(i)) {
110+
try!(self.add(i));
111+
}
112+
}
113+
Ok(())
114+
}
115+
101116
pub fn contains(&self, signum: SigNum) -> Result<bool> {
102117
let res = unsafe { libc::sigismember(&self.sigset as *const libc::sigset_t, signum) };
103118

@@ -260,6 +275,28 @@ mod tests {
260275
assert_eq!(all.contains(SIGUSR2), Ok(true));
261276
}
262277

278+
#[test]
279+
fn test_clear() {
280+
let mut set = SigSet::all();
281+
set.clear().unwrap();
282+
for i in 1..NSIG {
283+
assert_eq!(set.contains(i), Ok(false));
284+
}
285+
}
286+
287+
#[test]
288+
fn test_extend() {
289+
let mut one_signal = SigSet::empty();
290+
one_signal.add(SIGUSR1).unwrap();
291+
292+
let mut two_signals = SigSet::empty();
293+
two_signals.add(SIGUSR2).unwrap();
294+
two_signals.extend(&one_signal).unwrap();
295+
296+
assert_eq!(two_signals.contains(SIGUSR1), Ok(true));
297+
assert_eq!(two_signals.contains(SIGUSR2), Ok(true));
298+
}
299+
263300
#[test]
264301
fn test_thread_signal_block() {
265302
let mut mask = SigSet::empty();

0 commit comments

Comments
 (0)