Skip to content

Commit 25b553b

Browse files
committed
Adding POSIX stuff back into UnitTest++
1 parent 5c7d5a5 commit 25b553b

File tree

4 files changed

+149
-0
lines changed

4 files changed

+149
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include "SignalTranslator.h"
2+
3+
namespace UnitTest {
4+
5+
sigjmp_buf* SignalTranslator::s_jumpTarget = 0;
6+
7+
namespace {
8+
9+
void SignalHandler(int sig)
10+
{
11+
siglongjmp(*SignalTranslator::s_jumpTarget, sig );
12+
}
13+
14+
}
15+
16+
17+
SignalTranslator::SignalTranslator()
18+
{
19+
m_oldJumpTarget = s_jumpTarget;
20+
s_jumpTarget = &m_currentJumpTarget;
21+
22+
struct sigaction action;
23+
action.sa_flags = 0;
24+
action.sa_handler = SignalHandler;
25+
sigemptyset( &action.sa_mask );
26+
27+
sigaction( SIGSEGV, &action, &m_old_SIGSEGV_action );
28+
sigaction( SIGFPE , &action, &m_old_SIGFPE_action );
29+
sigaction( SIGTRAP, &action, &m_old_SIGTRAP_action );
30+
sigaction( SIGBUS , &action, &m_old_SIGBUS_action );
31+
sigaction( SIGILL , &action, &m_old_SIGBUS_action );
32+
}
33+
34+
SignalTranslator::~SignalTranslator()
35+
{
36+
sigaction( SIGILL , &m_old_SIGBUS_action , 0 );
37+
sigaction( SIGBUS , &m_old_SIGBUS_action , 0 );
38+
sigaction( SIGTRAP, &m_old_SIGTRAP_action, 0 );
39+
sigaction( SIGFPE , &m_old_SIGFPE_action , 0 );
40+
sigaction( SIGSEGV, &m_old_SIGSEGV_action, 0 );
41+
42+
s_jumpTarget = m_oldJumpTarget;
43+
}
44+
45+
46+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#ifndef UNITTEST_SIGNALTRANSLATOR_H
2+
#define UNITTEST_SIGNALTRANSLATOR_H
3+
4+
#include <setjmp.h>
5+
#include <signal.h>
6+
7+
namespace UnitTest {
8+
9+
class SignalTranslator
10+
{
11+
public:
12+
SignalTranslator();
13+
~SignalTranslator();
14+
15+
static sigjmp_buf* s_jumpTarget;
16+
17+
private:
18+
sigjmp_buf m_currentJumpTarget;
19+
sigjmp_buf* m_oldJumpTarget;
20+
21+
struct sigaction m_old_SIGFPE_action;
22+
struct sigaction m_old_SIGTRAP_action;
23+
struct sigaction m_old_SIGSEGV_action;
24+
struct sigaction m_old_SIGBUS_action;
25+
struct sigaction m_old_SIGABRT_action;
26+
struct sigaction m_old_SIGALRM_action;
27+
};
28+
29+
#if !defined (__GNUC__)
30+
#define UNITTEST_EXTENSION
31+
#else
32+
#define UNITTEST_EXTENSION __extension__
33+
#endif
34+
35+
#define UNITTEST_THROW_SIGNALS \
36+
UnitTest::SignalTranslator sig; \
37+
if (UNITTEST_EXTENSION sigsetjmp(*UnitTest::SignalTranslator::s_jumpTarget, 1) != 0) \
38+
throw ("Unhandled system exception");
39+
40+
}
41+
42+
#endif
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "TimeHelpers.h"
2+
#include <unistd.h>
3+
4+
namespace UnitTest {
5+
6+
Timer::Timer()
7+
{
8+
m_startTime.tv_sec = 0;
9+
m_startTime.tv_usec = 0;
10+
}
11+
12+
void Timer::Start()
13+
{
14+
gettimeofday(&m_startTime, 0);
15+
}
16+
17+
18+
int Timer::GetTimeInMs() const
19+
{
20+
struct timeval currentTime;
21+
gettimeofday(&currentTime, 0);
22+
int const dsecs = currentTime.tv_sec - m_startTime.tv_sec;
23+
int const dus = currentTime.tv_usec - m_startTime.tv_usec;
24+
return dsecs*1000 + dus/1000;
25+
}
26+
27+
28+
void TimeHelpers::SleepMs (int ms)
29+
{
30+
usleep(ms * 1000);
31+
}
32+
33+
}

UnitTest++/src/Posix/TimeHelpers.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef UNITTEST_TIMEHELPERS_H
2+
#define UNITTEST_TIMEHELPERS_H
3+
4+
#include <sys/time.h>
5+
6+
namespace UnitTest {
7+
8+
class Timer
9+
{
10+
public:
11+
Timer();
12+
void Start();
13+
int GetTimeInMs() const;
14+
15+
private:
16+
struct timeval m_startTime;
17+
};
18+
19+
20+
namespace TimeHelpers
21+
{
22+
void SleepMs (int ms);
23+
}
24+
25+
26+
}
27+
28+
#endif

0 commit comments

Comments
 (0)