| 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
 |