aboutsummaryrefslogtreecommitdiffstats
path: root/tests/UnitTest++/src/Posix/SignalTranslator.cpp
diff options
context:
space:
mode:
authorAdam Domurad <[email protected]>2012-11-21 12:37:38 -0500
committerAdam Domurad <[email protected]>2012-11-21 12:37:38 -0500
commit47e24eece15121c917a30166037cbb072bb6a443 (patch)
treefe7730603d16164711ff8db7b9dea283888aae90 /tests/UnitTest++/src/Posix/SignalTranslator.cpp
parent86bfc5f740524bdd7f341f9e1b90e39369ad7e8f (diff)
Add UnitTest++ source code into ITW, without integration.
Diffstat (limited to 'tests/UnitTest++/src/Posix/SignalTranslator.cpp')
-rw-r--r--tests/UnitTest++/src/Posix/SignalTranslator.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/UnitTest++/src/Posix/SignalTranslator.cpp b/tests/UnitTest++/src/Posix/SignalTranslator.cpp
new file mode 100644
index 0000000..3689c8c
--- /dev/null
+++ b/tests/UnitTest++/src/Posix/SignalTranslator.cpp
@@ -0,0 +1,46 @@
+#include "SignalTranslator.h"
+
+namespace UnitTest {
+
+sigjmp_buf* SignalTranslator::s_jumpTarget = 0;
+
+namespace {
+
+void SignalHandler(int sig)
+{
+ siglongjmp(*SignalTranslator::s_jumpTarget, sig );
+}
+
+}
+
+
+SignalTranslator::SignalTranslator()
+{
+ m_oldJumpTarget = s_jumpTarget;
+ s_jumpTarget = &m_currentJumpTarget;
+
+ struct sigaction action;
+ action.sa_flags = 0;
+ action.sa_handler = SignalHandler;
+ sigemptyset( &action.sa_mask );
+
+ sigaction( SIGSEGV, &action, &m_old_SIGSEGV_action );
+ sigaction( SIGFPE , &action, &m_old_SIGFPE_action );
+ sigaction( SIGTRAP, &action, &m_old_SIGTRAP_action );
+ sigaction( SIGBUS , &action, &m_old_SIGBUS_action );
+ sigaction( SIGILL , &action, &m_old_SIGBUS_action );
+}
+
+SignalTranslator::~SignalTranslator()
+{
+ sigaction( SIGILL , &m_old_SIGBUS_action , 0 );
+ sigaction( SIGBUS , &m_old_SIGBUS_action , 0 );
+ sigaction( SIGTRAP, &m_old_SIGTRAP_action, 0 );
+ sigaction( SIGFPE , &m_old_SIGFPE_action , 0 );
+ sigaction( SIGSEGV, &m_old_SIGSEGV_action, 0 );
+
+ s_jumpTarget = m_oldJumpTarget;
+}
+
+
+}