init: add runtime initialisation cookie

This commit is contained in:
Danny Robson 2020-04-23 08:06:14 +10:00
parent aa4a79aae2
commit 0927816e42
3 changed files with 100 additions and 0 deletions

View File

@ -407,6 +407,8 @@ list (
hash/wang.hpp
hash/xxhash.cpp
hash/xxhash.hpp
init.cpp
init.hpp
introspection.cpp
introspection.hpp
io.cpp

65
init.cpp Normal file
View File

@ -0,0 +1,65 @@
/******************************************************************************
_ _
| | | |
| | ___ | |__ ___
| |/ _ \| '_ \ / _ \
| | (_) | |_) | (_) |
|_|\___/|_.__/ \___/
Copyright:
Danny Robson, 2020
*****************************************************************************/
#include "init.hpp"
#include "log.hpp"
#include <atomic>
#include <memory>
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;
};
std::unique_ptr<state> s_state;
std::atomic<int> s_count;
}
//-----------------------------------------------------------------------------
// Increase the reference count and initialising the requisite functionality if
// this is the first instance of the class.
static void up (void)
{
if (int old = s_count++; !old)
s_state = std::make_unique<state> ();
}
//-----------------------------------------------------------------------------
// Decrease the reference count and release any resources if this was the last
// instance of the class.
static void down (void)
{
if (int old = --s_count; !old)
s_state.reset ();
}
///////////////////////////////////////////////////////////////////////////////
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 (); }

33
init.hpp Normal file
View File

@ -0,0 +1,33 @@
/******************************************************************************
_ _
| | | |
| | ___ | |__ ___
| |/ _ \| '_ \ / _ \
| | (_) | |_) | (_) |
|_|\___/|_.__/ \___/
Copyright:
Danny Robson, 2020
*****************************************************************************/
#pragma once
namespace cruft::init {
/// An object that ensures functionality that requires runtime
/// registration has been setup, and clears these resources at destruction
/// time.
///
/// Do not operate on instances of this class at the same time across
/// multiple threads. (It is safe to do so if access is has been locked)
///
/// In particular, this class ensures that:
/// * log::level_t has been registered for reflection
struct cookie {
cookie ();
cookie (cookie const&);
cookie& operator= (cookie const&);
cookie (cookie &&) noexcept;
cookie& operator= (cookie &&) noexcept;
~cookie ();
};
}