@@ -92,12 +92,27 @@ impl SigSet {
92
92
Errno :: result ( res) . map ( drop)
93
93
}
94
94
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
+
95
101
pub fn remove ( & mut self , signum : SigNum ) -> Result < ( ) > {
96
102
let res = unsafe { libc:: sigdelset ( & mut self . sigset as * mut libc:: sigset_t , signum) } ;
97
103
98
104
Errno :: result ( res) . map ( drop)
99
105
}
100
106
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
+
101
116
pub fn contains ( & self , signum : SigNum ) -> Result < bool > {
102
117
let res = unsafe { libc:: sigismember ( & self . sigset as * const libc:: sigset_t , signum) } ;
103
118
@@ -260,6 +275,28 @@ mod tests {
260
275
assert_eq ! ( all. contains( SIGUSR2 ) , Ok ( true ) ) ;
261
276
}
262
277
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
+
263
300
#[ test]
264
301
fn test_thread_signal_block ( ) {
265
302
let mut mask = SigSet :: empty ( ) ;
0 commit comments