summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Matthias Schaefer <philipp.matthias.schaefer@posteo.de>2016-04-10 19:46:54 +0200
committerPhilipp Matthias Schaefer <philipp.matthias.schaefer@posteo.de>2016-04-22 21:21:27 +0200
commit8698588ad1a19f4aff7e6ece537a8e6a631894ab (patch)
tree78a1609b443d6e4be788a845ec1188b771a33663
parent0210e30b3b75e9bd93b5e142408cd289f50ff9b0 (diff)
downloadnix-8698588ad1a19f4aff7e6ece537a8e6a631894ab.zip
Add SigSet::extend and SigSet::clear.
-rw-r--r--src/sys/signal.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/sys/signal.rs b/src/sys/signal.rs
index 6a1dd967..753c1562 100644
--- a/src/sys/signal.rs
+++ b/src/sys/signal.rs
@@ -92,12 +92,27 @@ impl SigSet {
Errno::result(res).map(drop)
}
+ pub fn clear(&mut self) -> Result<()> {
+ let res = unsafe { libc::sigemptyset(&mut self.sigset as *mut libc::sigset_t) };
+
+ Errno::result(res).map(drop)
+ }
+
pub fn remove(&mut self, signum: SigNum) -> Result<()> {
let res = unsafe { libc::sigdelset(&mut self.sigset as *mut libc::sigset_t, signum) };
Errno::result(res).map(drop)
}
+ pub fn extend(&mut self, other: &SigSet) -> Result<()> {
+ for i in 1..NSIG {
+ if try!(other.contains(i)) {
+ try!(self.add(i));
+ }
+ }
+ Ok(())
+ }
+
pub fn contains(&self, signum: SigNum) -> Result<bool> {
let res = unsafe { libc::sigismember(&self.sigset as *const libc::sigset_t, signum) };
@@ -261,6 +276,28 @@ mod tests {
}
#[test]
+ fn test_clear() {
+ let mut set = SigSet::all();
+ set.clear().unwrap();
+ for i in 1..NSIG {
+ assert_eq!(set.contains(i), Ok(false));
+ }
+ }
+
+ #[test]
+ fn test_extend() {
+ let mut one_signal = SigSet::empty();
+ one_signal.add(SIGUSR1).unwrap();
+
+ let mut two_signals = SigSet::empty();
+ two_signals.add(SIGUSR2).unwrap();
+ two_signals.extend(&one_signal).unwrap();
+
+ assert_eq!(two_signals.contains(SIGUSR1), Ok(true));
+ assert_eq!(two_signals.contains(SIGUSR2), Ok(true));
+ }
+
+ #[test]
fn test_thread_signal_block() {
let mut mask = SigSet::empty();
mask.add(SIGUSR1).unwrap();