1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /*
- * 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
- #include "catch_platform.h"
- #include "catch_compiler_capabilities.h"
- #include <cassert>
- namespace Catch {
- // Wrapper for platform-specific fatal error (signals/SEH) handlers
- //
- // Tries to be cooperative with other handlers, and not step over
- // other handlers. This means that unknown structured exceptions
- // are passed on, previous signal handlers are called, and so on.
- //
- // Can only be instantiated once, and assumes that once a signal
- // is caught, the binary will end up terminating. Thus, there
- class FatalConditionHandler {
- bool m_started = false;
- // Install/disengage implementation for specific platform.
- // Should be if-defed to work on current platform, can assume
- // engage-disengage 1:1 pairing.
- void engage_platform();
- void disengage_platform();
- public:
- // Should also have platform-specific implementations as needed
- FatalConditionHandler();
- ~FatalConditionHandler();
- void engage() {
- assert(!m_started && "Handler cannot be installed twice.");
- m_started = true;
- engage_platform();
- }
- void disengage() {
- assert(m_started && "Handler cannot be uninstalled without being installed first");
- m_started = false;
- disengage_platform();
- }
- };
- //! Simple RAII guard for (dis)engaging the FatalConditionHandler
- class FatalConditionHandlerGuard {
- FatalConditionHandler* m_handler;
- public:
- FatalConditionHandlerGuard(FatalConditionHandler* handler):
- m_handler(handler) {
- m_handler->engage();
- }
- ~FatalConditionHandlerGuard() {
- m_handler->disengage();
- }
- };
- } // end namespace Catch
- #endif // TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
|