EvolvingObjects
|
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