/****************************************************************************** _ _ | | | | | | ___ | |__ ___ | |/ _ \| '_ \ / _ \ | | (_) | |_) | (_) | |_|\___/|_.__/ \___/ Copyright: Danny Robson, 2020 *****************************************************************************/ #include "init.hpp" #include "log.hpp" #include #include using cruft::init::cookie; /////////////////////////////////////////////////////////////////////////////// namespace { // Stores the various RAII handlers for any registered functionality that // requires it. struct state { state () : log (cruft::log::setup_level_reflection ()) { ; } cruft::parse::enumeration::cookie log; }; static std::unique_ptr s_state; } //----------------------------------------------------------------------------- // NOTE: We were using reference counting to cleanup s_state at cookie // destruction time, but for some reason this results in a double-free under // gcc-usan. It's easier to just allow it to live past the useful period and // perform cleanup atexit. static void up (void) { if (!s_state) s_state = std::make_unique (); } //----------------------------------------------------------------------------- static void down (void) { } /////////////////////////////////////////////////////////////////////////////// cookie::cookie () { up (); } cookie::cookie (cookie &&) noexcept { up (); } cookie::cookie (cookie const&) { up (); } cookie& cookie::operator= (cookie &&) noexcept { up (); return *this; } cookie& cookie::operator= (cookie const&) { up (); return *this; } cookie::~cookie () { down (); }