EvolvingObjects
|
00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- 00002 00003 //----------------------------------------------------------------------------- 00004 // eoSIGContinue.h 00005 // (c) EEAAX 1996 - GeNeura Team, 1998 - Maarten Keijzer 2000 00006 /* 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with this library; if not, write to the Free Software 00019 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 00021 Contact: todos@geneura.ugr.es, http://geneura.ugr.es 00022 Marc.Schoenauer@polytechnique.fr 00023 mak@dhi.dk 00024 Johann Dréo <nojhan@gmail.com> 00025 Caner Candan <caner@candan.fr> 00026 */ 00027 //----------------------------------------------------------------------------- 00028 // the same thing can probably be done in MS environement, but I hoave no way 00029 // to test it so at the moment it is commented out when in MSVC 00030 00031 00032 #ifndef eoSIGContinue_h 00033 #define eoSIGContinue_h 00034 00035 #include <signal.h> 00036 #include <eoContinue.h> 00037 00042 extern bool existSIGContinue; 00043 extern bool call_func; 00044 00045 void set_bool(int) 00046 { 00047 call_func = true; 00048 } 00049 00053 template< class EOT> 00054 class eoSIGContinue: public eoContinue<EOT> 00055 { 00056 public: 00058 eoSIGContinue(int sig, sighandler_t fct) 00059 : _sig(sig), _fct(fct) 00060 { 00061 // First checks that no other eoSIGContinue does exist 00062 if (existSIGContinue) 00063 throw std::runtime_error("A signal handler is already defined!\n"); 00064 00065 #ifndef _WINDOWS 00066 #ifdef SIGQUIT 00067 ::signal( sig, set_bool ); 00068 existSIGContinue = true; 00069 #endif 00070 #endif 00071 } 00072 00074 virtual bool operator() ( const eoPop<EOT>& _vEO ) 00075 { 00076 if (call_func) 00077 { 00078 _fct(_sig); 00079 call_func = false; 00080 } 00081 00082 return true; 00083 } 00084 00085 virtual std::string className(void) const { return "eoSIGContinue"; } 00086 private: 00087 int _sig; 00088 sighandler_t _fct; 00089 }; 00090 00093 #endif 00094 00095 // of MSVC comment-out