From a74e280bb4ba3a4fb6396c1bb6368c376f50ec48 Mon Sep 17 00:00:00 2001 From: Denis Ivaykin Date: Sat, 9 May 2015 13:14:16 +0200 Subject: [PATCH] vector / mutex --- include/spdlog/details/registry.h | 44 ++++++++++++++++++++++++++++++- include/spdlog/tweakme.h | 12 +++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/include/spdlog/details/registry.h b/include/spdlog/details/registry.h index 5f708743..6c6e2d30 100644 --- a/include/spdlog/details/registry.h +++ b/include/spdlog/details/registry.h @@ -54,9 +54,19 @@ public: std::shared_ptr get(const std::string& logger_name) { +#ifndef SPDLOG_NO_REGISTRY_MUTEX std::lock_guard lock(_mutex); +#endif +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + for (auto& logger : _loggers) { + if (logger_name == logger->name()) + return logger; + } + return nullptr; +#else auto found = _loggers.find(logger_name); return found == _loggers.end() ? nullptr : found->second; +#endif } template @@ -84,7 +94,17 @@ public: void drop(const std::string& logger_name) { std::lock_guard lock(_mutex); +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + for (auto it = _loggers.begin(); it != _loggers.end();) { + if (logger_name == (*it)->name()) { + it = _loggers.erase(it); + } else { + ++it; + } + } +#else _loggers.erase(logger_name); +#endif } void drop_all() @@ -108,7 +128,11 @@ public: std::lock_guard lock(_mutex); _formatter = f; for (auto& l : _loggers) +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + l->set_formatter(_formatter); +#else l.second->set_formatter(_formatter); +#endif } void set_pattern(const std::string& pattern) @@ -116,14 +140,22 @@ public: std::lock_guard lock(_mutex); _formatter = std::make_shared(pattern); for (auto& l : _loggers) +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + l->set_formatter(_formatter); +#else l.second->set_formatter(_formatter); +#endif } void set_level(level::level_enum log_level) { std::lock_guard lock(_mutex); for (auto& l : _loggers) +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + l->set_level(log_level); +#else l.second->set_level(log_level); +#endif _level = log_level; } @@ -152,15 +184,25 @@ private: void register_logger_impl(std::shared_ptr logger) { auto logger_name = logger->name(); - if (_loggers.find(logger_name) != std::end(_loggers)) + if (get(logger_name) != nullptr) throw spdlog_ex("logger with name " + logger_name + " already exists"); +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + _loggers.push_back(logger); +#else _loggers[logger->name()] = logger; +#endif } registry() = default; registry(const registry&) = delete; registry& operator=(const registry&) = delete; std::mutex _mutex; + +#ifdef SPDLOG_VECTOR_BASED_REGISTRY + std::vector > _loggers; +#else std::unordered_map > _loggers; +#endif + formatter_ptr _formatter; level::level_enum _level = level::info; bool _async_mode = false; diff --git a/include/spdlog/tweakme.h b/include/spdlog/tweakme.h index 20e2c5e4..9e56b202 100644 --- a/include/spdlog/tweakme.h +++ b/include/spdlog/tweakme.h @@ -64,3 +64,15 @@ // #define SPDLOG_DEBUG_ON // #define SPDLOG_TRACE_ON /////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable lockless registry +// #define SPDLOG_NO_REGISTRY_MUTEX +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable vector based registry +// #define SPDLOG_VECTOR_BASED_REGISTRY +///////////////////////////////////////////////////////////////////////////////