libzypp  10.5.0
Signal.h
Go to the documentation of this file.
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