2014-08-22 09:07:39 +02:00
|
|
|
/*
|
|
|
|
* Created by Phil on 21/08/2014
|
|
|
|
* Copyright 2014 Two Blue Cubes Ltd. All rights reserved.
|
|
|
|
*
|
|
|
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#ifndef TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
|
|
|
|
#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
|
|
|
|
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
// Report the error condition then exit the process
|
|
|
|
inline void fatal( std::string const& message, int exitCode ) {
|
|
|
|
IContext& context = Catch::getCurrentContext();
|
|
|
|
IResultCapture* resultCapture = context.getResultCapture();
|
2014-08-22 20:33:28 +02:00
|
|
|
resultCapture->handleFatalErrorCondition( message );
|
|
|
|
|
2014-08-22 09:07:39 +02:00
|
|
|
if( Catch::alwaysTrue() ) // avoids "no return" warnings
|
|
|
|
exit( exitCode );
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Catch
|
|
|
|
|
|
|
|
#if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
2014-10-21 08:24:30 +02:00
|
|
|
struct FatalConditionHandler {
|
|
|
|
void reset() {}
|
|
|
|
};
|
2014-08-22 09:07:39 +02:00
|
|
|
|
|
|
|
} // namespace Catch
|
|
|
|
|
|
|
|
#else // Not Windows - assumed to be POSIX compatible //////////////////////////
|
|
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
struct SignalDefs { int id; const char* name; };
|
|
|
|
extern SignalDefs signalDefs[];
|
|
|
|
SignalDefs signalDefs[] = {
|
|
|
|
{ SIGINT, "SIGINT - Terminal interrupt signal" },
|
|
|
|
{ SIGILL, "SIGILL - Illegal instruction signal" },
|
|
|
|
{ SIGFPE, "SIGFPE - Floating point error signal" },
|
|
|
|
{ SIGSEGV, "SIGSEGV - Segmentation violation signal" },
|
|
|
|
{ SIGTERM, "SIGTERM - Termination request signal" },
|
|
|
|
{ SIGABRT, "SIGABRT - Abort (abnormal termination) signal" }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct FatalConditionHandler {
|
|
|
|
|
|
|
|
static void handleSignal( int sig ) {
|
|
|
|
for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
|
|
|
|
if( sig == signalDefs[i].id )
|
|
|
|
fatal( signalDefs[i].name, -sig );
|
|
|
|
fatal( "<unknown signal>", -sig );
|
|
|
|
}
|
|
|
|
|
2014-10-02 19:28:45 +02:00
|
|
|
FatalConditionHandler() : m_isSet( true ) {
|
2014-08-22 09:07:39 +02:00
|
|
|
for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
|
|
|
|
signal( signalDefs[i].id, handleSignal );
|
|
|
|
}
|
|
|
|
~FatalConditionHandler() {
|
2014-10-02 19:28:45 +02:00
|
|
|
reset();
|
|
|
|
}
|
|
|
|
void reset() {
|
|
|
|
if( m_isSet ) {
|
|
|
|
for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
|
|
|
|
signal( signalDefs[i].id, SIG_DFL );
|
|
|
|
m_isSet = false;
|
|
|
|
}
|
2014-08-22 09:07:39 +02:00
|
|
|
}
|
2014-10-02 19:28:45 +02:00
|
|
|
|
|
|
|
bool m_isSet;
|
2014-08-22 09:07:39 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Catch
|
|
|
|
|
|
|
|
#endif // not Windows
|
|
|
|
|
|
|
|
#endif // TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
|