From 7a5fa7fa2de26b7aa5de76ae2e830dcbac6e11e4 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Thu, 10 Oct 2019 16:02:10 +1100 Subject: [PATCH] log: allow setting the default_sink --- log/level.hpp | 4 ++++ log/log.cpp | 24 ++++++++++++++++++++++-- log/log.hpp | 10 ++++------ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/log/level.hpp b/log/level.hpp index e97a4593..59989969 100644 --- a/log/level.hpp +++ b/log/level.hpp @@ -12,6 +12,10 @@ #include +// Windows.h or one of its friends defines a macro 'ERROR'. Screw Microsoft. +#ifdef ERROR +#undef ERROR +#endif namespace cruft::log { /////////////////////////////////////////////////////////////////////////// diff --git a/log/log.cpp b/log/log.cpp index 3d926b8a..4b79151f 100644 --- a/log/log.cpp +++ b/log/log.cpp @@ -14,6 +14,7 @@ #include "sink/console.hpp" +#include #include #include @@ -42,11 +43,30 @@ cruft::log::needs_break (level_t level) /////////////////////////////////////////////////////////////////////////////// +static std::once_flag s_sink_init; +static std::unique_ptr s_default_sink; + + +//----------------------------------------------------------------------------- +cruft::log::sink::base& +cruft::log::default_sink (std::unique_ptr value) +{ + s_default_sink = std::move (value); + return *s_default_sink; +} + + +//----------------------------------------------------------------------------- cruft::log::sink::base& cruft::log::default_sink () { - static sink::console s_default_sink (PACKAGE_NAME); - return s_default_sink; + std::call_once (s_sink_init, [&] () { + default_sink ( + std::make_unique (PACKAGE_NAME) + ); + }); + + return *s_default_sink; } diff --git a/log/log.hpp b/log/log.hpp index d974bd87..58a9f710 100644 --- a/log/log.hpp +++ b/log/log.hpp @@ -13,19 +13,17 @@ #include "sink/base.hpp" #include "../format.hpp" - -#include +#include #include -// Windows.h or one of its friends defines a macro 'ERROR'. Screw Microsoft. -#ifdef ERROR -#undef ERROR -#endif namespace cruft::log { /////////////////////////////////////////////////////////////////////////// sink::base& default_sink (void); + sink::base& default_sink (std::unique_ptr); + + //------------------------------------------------------------------------- void write (level_t, std::string const &msg); void write (level_t, char const *msg); void write (level_t, std::string_view msg);