EvolvingObjects
eoSignal.h
00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
00002 
00026 #ifndef _eoSignal_h
00027 #define _eoSignal_h
00028 
00029 #include <csignal>
00030 #include <utils/eoCheckPoint.h>
00031 #include <utils/eoLogger.h>
00032 
00033 #include <map>
00034 #include <vector>
00035 
00041 extern std::map< int, bool > signals_called;
00042 
00047 template <class EOT>
00048 class eoSignal : public eoCheckPoint<EOT>
00049 {
00050 public :
00051 
00052     eoSignal( int sig = SIGINT ) : eoCheckPoint<EOT>( _dummyContinue ), _sig( sig )
00053     {
00054         ::signals_called[_sig] = false;
00055 
00056 #ifndef _WINDOWS
00057 #ifdef SIGQUIT
00058         ::signal( _sig, handler );
00059 #endif // !SIGQUIT
00060 #endif // !_WINDOWS
00061     }
00062 
00063     eoSignal( eoContinue<EOT>& _cont, int sig = SIGINT ) : eoCheckPoint<EOT>( _cont ), _sig( sig )
00064     {
00065         ::signals_called[_sig] = false;
00066 
00067 #ifndef _WINDOWS
00068 #ifdef SIGQUIT
00069         ::signal( _sig, handler );
00070 #endif // !SIGQUIT
00071 #endif // !_WINDOWS
00072     }
00073 
00074     bool operator()( const eoPop<EOT>& _pop )
00075     {
00076         bool& called = ::signals_called[_sig];
00077         if ( called )
00078             {
00079                 eo::log << eo::logging << "Signal granted…" << std::endl ;
00080                 called = false;
00081                 return this->eoCheckPoint<EOT>::operator()( _pop );
00082             }
00083         return true;
00084     }
00085 
00086     virtual std::string className(void) const { return "eoSignal"; }
00087 
00088     static void handler( int sig )
00089     {
00090         ::signals_called[sig] = true;
00091         eo::log << eo::logging << "Signal wished…" << std::endl ;
00092     }
00093 
00094 private:
00095     class DummyContinue : public eoContinue<EOT>
00096     {
00097     public:
00098         bool operator() ( const eoPop<EOT>& ) { return true; }
00099     } _dummyContinue;
00100 
00101     int _sig;
00102 };
00103 
00106 #endif // !_eoSignal_h
 All Classes Namespaces Files Functions Variables Typedefs Friends