54 lines
866 B
C++
54 lines
866 B
C++
#ifndef SIGNAL_TRANSLATOR_H
|
|
#define SIGNAL_TRANSLATOR_H
|
|
|
|
#include <signal.h>
|
|
#include <setjmp.h>
|
|
|
|
namespace CppTestHarness
|
|
{
|
|
|
|
template <int SIGNAL>
|
|
class SignalTranslator {
|
|
public:
|
|
SignalTranslator()
|
|
{
|
|
//setup new signal handler
|
|
struct sigaction act;
|
|
act.sa_handler = signalHandler;
|
|
sigemptyset(&act.sa_mask);
|
|
act.sa_flags = 0;
|
|
|
|
sigaction(SIGNAL, &act, &m_oldAction);
|
|
|
|
if (sigsetjmp(getJumpPoint(), 1) != 0)
|
|
{
|
|
//if signal thrown we will return here from handler
|
|
throw "Unhandled system exception";
|
|
}
|
|
}
|
|
|
|
~SignalTranslator()
|
|
{
|
|
sigaction(SIGNAL, &m_oldAction, 0);
|
|
}
|
|
|
|
private:
|
|
static void signalHandler(int signum)
|
|
{
|
|
siglongjmp(getJumpPoint(), signum);
|
|
}
|
|
|
|
static sigjmp_buf& getJumpPoint()
|
|
{
|
|
static sigjmp_buf jmpPnt;
|
|
return jmpPnt;
|
|
}
|
|
|
|
struct sigaction m_oldAction;
|
|
};
|
|
|
|
} //CppTestHarness
|
|
|
|
#endif //SIGNAL_TRANSLATOR_H
|
|
|