00001 #ifndef UNITTEST_SIGNALTRANSLATOR_H 00002 #define UNITTEST_SIGNALTRANSLATOR_H 00003 00004 #include <setjmp.h> 00005 #include <signal.h> 00006 00007 namespace UnitTest { 00008 00009 class SignalTranslator 00010 { 00011 public: 00012 SignalTranslator(); 00013 ~SignalTranslator(); 00014 00015 static sigjmp_buf* s_jumpTarget; 00016 00017 private: 00018 sigjmp_buf m_currentJumpTarget; 00019 sigjmp_buf* m_oldJumpTarget; 00020 00021 struct sigaction m_old_SIGFPE_action; 00022 struct sigaction m_old_SIGTRAP_action; 00023 struct sigaction m_old_SIGSEGV_action; 00024 struct sigaction m_old_SIGBUS_action; 00025 struct sigaction m_old_SIGABRT_action; 00026 struct sigaction m_old_SIGALRM_action; 00027 }; 00028 00029 #if !defined (__GNUC__) 00030 #define UNITTEST_EXTENSION 00031 #else 00032 #define UNITTEST_EXTENSION __extension__ 00033 #endif 00034 00035 #define UNITTEST_THROW_SIGNALS \ 00036 UnitTest::SignalTranslator sig; \ 00037 if (UNITTEST_EXTENSION sigsetjmp(*UnitTest::SignalTranslator::s_jumpTarget, 1) != 0) \ 00038 throw ("Unhandled system exception"); 00039 00040 } 00041 00042 #endif