From: Christian P. <cp...@us...> - 2005-04-28 10:24:08
|
Update of /cvsroot/pclasses/pclasses2/src/System In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30213/src/System Modified Files: SignalListener.h SignalListener.posix.cpp Log Message: - Restore previous signal handlers Index: SignalListener.posix.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/System/SignalListener.posix.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- SignalListener.posix.cpp 25 Apr 2005 10:57:31 -0000 1.5 +++ SignalListener.posix.cpp 28 Apr 2005 10:23:57 -0000 1.6 @@ -18,6 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "pclasses/Trace.h" #include "pclasses/System/EventQueue.h" #include "pclasses/CircularQueue.h" #include "SignalListener.h" @@ -138,6 +139,8 @@ qs = _signals.front(); _signals.pop(); + P_TRACE(SignalFdListener) << "Dispatching signal sig=" << qs.sig; + if(_listeners[qs.sig]) _listeners[qs.sig]->onSignal(qs.val); } @@ -179,29 +182,29 @@ } SignalListener::SignalListener(int sig) +: _sig(sig) { - setup(sig); -} + P_TRACE(SignalListener) << "Installing signal handler for sig=" << sig; + + struct sigaction sa; + sa.sa_sigaction = &signal_handler; + sigfillset(&sa.sa_mask); // block all signals during signal handler's execution + sa.sa_flags = SA_RESTART|SA_SIGINFO; // restart system calls, use 3 param sighandler -SignalListener::~SignalListener() -{ SignalFdListener& l = SignalFdListener::instance(); - l.removeListener(*this); + l.addListener(_sig, *this); - //TODO: restore previous signal handler ... + sigaction(_sig, &sa, &savedSigActions[_sig]); } -void SignalListener::setup(int sig) +SignalListener::~SignalListener() { - struct sigaction sa; - sa.sa_sigaction = &signal_handler; - sigfillset(&sa.sa_mask); // block all signals during signal handler's execution - sa.sa_flags = SA_RESTART|SA_SIGINFO; // restart system calls, use 3 param sighandler + P_TRACE(SignalListener) << "Destroying signal handler for sig=" << _sig; SignalFdListener& l = SignalFdListener::instance(); - l.addListener(sig, *this); + l.removeListener(*this); - sigaction(sig, &sa, &savedSigActions[sig]); + sigaction(_sig, &savedSigActions[_sig], 0); } } //! namespace System Index: SignalListener.h =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/System/SignalListener.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- SignalListener.h 23 Apr 2005 17:48:03 -0000 1.2 +++ SignalListener.h 28 Apr 2005 10:23:57 -0000 1.3 @@ -37,7 +37,7 @@ virtual void onSignal(const sigval& sv) = 0; private: - void setup(int sig); + int _sig; }; } // !namespace System |