1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/Signal.h
12 #ifndef ZYPP_BASE_SIGNAL_H
13 #define ZYPP_BASE_SIGNAL_H
18 ///////////////////////////////////////////////////////////////////
20 { /////////////////////////////////////////////////////////////////
22 /** Exception safe signal handler save/restore.
28 SignalSaver( int signum_r, sighandler_t handler_r )
30 { _orighandler = ::signal( signum_r, handler_r ); }
32 { ::signal( _signum, _orighandler ); }
35 ::sighandler_t _orighandler;
38 /** Exception safe sigprocmask save/restore.
41 class SigprocmaskSaver
44 /** Ctor saving the original sigprocmask. */
46 { ::sigprocmask( SIG_SETMASK, NULL, &_origmask ); }
47 /** Dtor restoring the original sigprocmask. */
49 { ::sigprocmask( SIG_SETMASK, &_origmask, NULL ); }
51 /** Temporary block signal. */
52 void block( int signum_r )
55 ::sigemptyset( & mask );
56 ::sigaddset( & mask, signum_r );
57 ::sigprocmask( SIG_BLOCK, &mask, NULL );
59 /** Temporary unblock signal. */
60 void unblock( int signum_r )
63 ::sigemptyset( & mask );
64 ::sigaddset( & mask, signum_r );
65 ::sigprocmask( SIG_UNBLOCK, &mask, NULL );
67 /** Whether signal delivery is pending. */
68 bool pending( int signum_r )
71 ::sigpending( &mask );
72 return ::sigismember( &mask, signum_r );
74 /** Wait for signals not blocked in original sigprocmask. */
76 { ::sigsuspend( &_origmask ); }
81 /////////////////////////////////////////////////////////////////
83 ///////////////////////////////////////////////////////////////////
84 #endif // ZYPP_BASE_SIGNAL_H