libzypp
10.5.0
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 00005 | / /__ | | | | | | | 00006 | /_____||_| |_| |_| | 00007 | | 00008 \---------------------------------------------------------------------*/ 00012 #ifndef ZYPP_BASE_SIGNAL_H 00013 #define ZYPP_BASE_SIGNAL_H 00014 00015 #include <csignal> 00016 #include <iosfwd> 00017 00019 namespace zypp 00020 { 00021 00025 class SignalSaver 00026 { 00027 public: 00028 SignalSaver( int signum_r, sighandler_t handler_r ) 00029 : _signum( signum_r ) 00030 { _orighandler = ::signal( signum_r, handler_r ); } 00031 ~SignalSaver() 00032 { ::signal( _signum, _orighandler ); } 00033 private: 00034 int _signum; 00035 ::sighandler_t _orighandler; 00036 }; 00037 00041 class SigprocmaskSaver 00042 { 00043 public: 00045 SigprocmaskSaver() 00046 { ::sigprocmask( SIG_SETMASK, NULL, &_origmask ); } 00048 ~SigprocmaskSaver() 00049 { ::sigprocmask( SIG_SETMASK, &_origmask, NULL ); } 00050 public: 00052 void block( int signum_r ) 00053 { 00054 ::sigset_t mask; 00055 ::sigemptyset( & mask ); 00056 ::sigaddset( & mask, signum_r ); 00057 ::sigprocmask( SIG_BLOCK, &mask, NULL ); 00058 } 00060 void unblock( int signum_r ) 00061 { 00062 ::sigset_t mask; 00063 ::sigemptyset( & mask ); 00064 ::sigaddset( & mask, signum_r ); 00065 ::sigprocmask( SIG_UNBLOCK, &mask, NULL ); 00066 } 00068 bool pending( int signum_r ) 00069 { 00070 ::sigset_t mask; 00071 ::sigpending( &mask ); 00072 return ::sigismember( &mask, signum_r ); 00073 } 00075 void suspend() 00076 { ::sigsuspend( &_origmask ); } 00077 private: 00078 ::sigset_t _origmask; 00079 }; 00080 00082 } // namespace zypp 00084 #endif // ZYPP_BASE_SIGNAL_H