Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 2147feaa rédigé par Kubat's avatar Kubat
Parcourir les fichiers

[WIP] Fix stuff to get the VIVY_NEW_LOG_SINK macro working

parent 4ebf6920
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!21Add clean logs support + dependent MR
......@@ -2,12 +2,32 @@
using namespace Vivy;
LogSink::~LogSink() noexcept {}
LogMessage::~LogMessage() noexcept { parentLogger->sendLogMessage(*this); }
Logger::~Logger() noexcept { parentLogSink->closeLoggerClient(this); }
std::shared_ptr<LogSink>
LogSink::newSink() noexcept
{
struct makeSharedEnabler : public LogSink {
// NOTE: For make_shared with private CTor
};
return std::make_shared<makeSharedEnabler>();
}
void
LogSink::closeLoggerClient(Logger *const logger) noexcept
{
clientLoggers.erase(std::remove_if(std::begin(clientLoggers), std::end(clientLoggers),
[logger](const std::shared_ptr<Logger> &ptr) {
return ptr.get() == logger;
}));
}
void
LogSink::closeLoggerClient(const std::shared_ptr<Logger> &ptr) noexcept
{
closeLoggerClient(ptr.get());
}
LogMessage
......
......@@ -5,13 +5,15 @@
#define VIVY_NEW_LOG_SINK() LogSink::newSink()
#define VIVY_GET_LOGGER(sink, cat) sink->createClient(cat)
#define VIVY_LOG_WITH_LEVEL(log, level) log->logEvent(__FILE__, __function__, __LINE__, level)
#define VIVY_LOG_WITH_LEVEL(log, level) log->logEvent(__FILE__, __func__, __LINE__, level)
#define VIVY_LOG_WARN(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Warning)
#define VIVY_LOG_DEBUG(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Debug)
#define VIVY_LOG_INFO(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Info)
#define VIVY_LOG_ERR(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Error)
#define VIVY_LOG_FATAL(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Critical)
#define VIVY_DCL_LOG_SINK(sink) std::shared_ptr<LogSink> sink{ VIVY_NEW_LOG_SINK() };
#define VIVY_LOGGABLE_OBJECT(sink, name, logger) \
std::shared_ptr<Logger> logger = VIVY_GET_LOGGER(sink, name); \
LogMessage logFatal() const noexcept { return VIVY_LOG_FATAL(logger); } \
......@@ -35,7 +37,8 @@ enum class LogLevel : int {
Error = 4,
Warning = 3,
Info = 2,
Debug = 1
Debug = 1,
None = std::numeric_limits<int>::min() // In option setup to disable logs
};
// Message to be logged, constructed by a logger then send
......@@ -71,10 +74,9 @@ public:
// A logger class, a client to LogSink. Will generate and send instances of
// LogMessage.
class Logger final {
class Logger {
VIVY_UNMOVABLE_OBJECT(Logger)
friend class LogSink;
friend class std::shared_ptr<Logger>;
LogSink *const parentLogSink;
const std::string logCategory;
......@@ -97,9 +99,17 @@ class Logger final {
{
}
public:
~Logger() noexcept;
// Shortcut because of std::make_shared
static std::shared_ptr<Logger> createAndAttachClient(LogSink *const sink,
StringType auto const &category) noexcept
{
struct makeSharedEnabler : public Logger {
// NOTE: For make_shared with private CTor
};
return std::make_shared<makeSharedEnabler>(sink, category);
}
public:
void sendLogMessage(const LogMessage &) const noexcept;
LogMessage logEvent(const char *fileName, const char *functionName, const int lineNumber,
const LogLevel) noexcept;
......@@ -107,19 +117,20 @@ public:
// LogSink is the parent logger. It will recieve messages and display them to a
// console or to std::cerr or to a file, etc.
class LogSink final {
class LogSink {
VIVY_UNMOVABLE_OBJECT(LogSink)
LogSink() noexcept;
LogSink() noexcept = default;
public:
static std::shared_ptr<LogSink> newSink() noexcept;
~LogSink() noexcept;
void closeLoggerClient(Logger *const) noexcept;
void closeLoggerClient(const std::shared_ptr<Logger> &) noexcept;
std::shared_ptr<Logger> createClient(StringType auto const &category) noexcept
{
auto ret = std::make_shared<Logger>(this, category);
auto ret = Logger::createAndAttachClient(this, category);
clientLoggers.push_back(ret);
return ret;
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter