From 3127af5bc75acfcd4658fb9b72d137fa20d59bdf Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 30 May 2024 16:30:09 +0300 Subject: [PATCH 1/2] Custom formatter for flag 't', new Utils::GetThreadName() --- openVulkanoCpp/Base/Logger.cpp | 22 +++++++++++++++++++--- openVulkanoCpp/Base/Logger.hpp | 10 ++++++++++ openVulkanoCpp/Base/Utils.cpp | 23 +++++++++++++++++++++++ openVulkanoCpp/Base/Utils.hpp | 1 + 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index de3ca6c..55641de 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -7,6 +7,7 @@ #include "Math/ByteSize.hpp" #include "Logger.hpp" #include "IO/AppFolders.hpp" +#include "Utils.hpp" #include #include #include @@ -137,15 +138,18 @@ namespace OpenVulkano if (reg) { auto logger = spdlog::get(name); if (logger) return logger; } auto logger = std::make_shared(name, SINKS.begin(), SINKS.end()); if (reg) spdlog::register_logger(logger); + auto formatter = std::make_unique(); + formatter->add_flag('t'); // overloading t + #ifdef LOG_DATE - logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [T%t] [%^%l%$] [%n]: %v"); + formatter->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [T:%t] [%^%l%$] [%n]: %v"); #else - logger->set_pattern("[%H:%M:%S.%e] [T%t] [%^%l%$] [%n]: %v"); + formatter->set_pattern("[%H:%M:%S.%e] [T:%t] [%^%l%$] [%n]: %v"); #endif #ifdef DEBUG logger->set_level(spdlog::level::debug); #endif - + logger->set_formatter(std::move(formatter)); logger->flush_on(spdlog::level::err); // Flush on error LOGGERS.push_back(logger); @@ -174,4 +178,16 @@ namespace OpenVulkano } SINKS.push_back(newSink); } + + void CustomThreadNameFormatterFlag::format(const spdlog::details::log_msg &msg, const std::tm &tmTime, spdlog::memory_buf_t &dest) + { + std::string threadName = OpenVulkano::Utils::GetThreadName(); + // NOTE(vb): What should be displayed if the thread name wasn't specified? + dest.append(threadName.c_str(), threadName.c_str() + threadName.length()); + } + + std::unique_ptr CustomThreadNameFormatterFlag::clone() const + { + return spdlog::details::make_unique(); + } } diff --git a/openVulkanoCpp/Base/Logger.hpp b/openVulkanoCpp/Base/Logger.hpp index fb5b653..ef3b502 100644 --- a/openVulkanoCpp/Base/Logger.hpp +++ b/openVulkanoCpp/Base/Logger.hpp @@ -10,6 +10,8 @@ #define SPDLOG_TRACE_ON #include +#include +#include namespace OpenVulkano { @@ -48,4 +50,12 @@ namespace OpenVulkano static void RegisterSink(const spdlog::sink_ptr& newSink); }; + + class CustomThreadNameFormatterFlag : public spdlog::custom_flag_formatter + { + public: + void format(const spdlog::details::log_msg &msg, const std::tm &tmTime, spdlog::memory_buf_t &dest) override; + std::unique_ptr clone() const override; + }; + } \ No newline at end of file diff --git a/openVulkanoCpp/Base/Utils.cpp b/openVulkanoCpp/Base/Utils.cpp index f67c51e..d452509 100644 --- a/openVulkanoCpp/Base/Utils.cpp +++ b/openVulkanoCpp/Base/Utils.cpp @@ -12,6 +12,9 @@ #include #endif #include +#include +#include +#include namespace OpenVulkano { @@ -28,6 +31,26 @@ namespace OpenVulkano #endif } + std::string Utils::GetThreadName() + { +#ifdef _MSC_VER + auto thisThread = ::GetCurrentThread(); + PWSTR threadName; + GetThreadDescription(thisThread, &threadName); + std::wstring_convert> converter; + std::string str = converter.to_bytes(threadName); + LocalFree(threadName); + return str; +#else + // NOTE(vb): Accoring to linux man page size of this array must be _at least_ 16 bytes... + // But I don't know whether is it applicable to have the buffer of bigger size + char threadName[16]; + pthread_getname_np(pthread_self(), threadName, sizeof(threadName)); + std::string str = threadName; + return str; +#endif + } + Array Utils::ReadFile(const std::string& filePath, bool emptyOnMissing) { std::ifstream file(filePath, std::ios::ate | std::ios::binary); diff --git a/openVulkanoCpp/Base/Utils.hpp b/openVulkanoCpp/Base/Utils.hpp index 23db9a2..9c803bd 100644 --- a/openVulkanoCpp/Base/Utils.hpp +++ b/openVulkanoCpp/Base/Utils.hpp @@ -19,6 +19,7 @@ namespace OpenVulkano { public: static void SetThreadName(const std::string& name); + static std::string GetThreadName(); static inline std::vector toCString(const std::vector& values) { From 75b5f635ef8751ae603b091287df9b505e09414a Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 30 May 2024 17:52:02 +0300 Subject: [PATCH 2/2] Fallback to display thread id of no name was assigned, OpenVulkano::Utils::GetThreadId() --- openVulkanoCpp/Base/Logger.cpp | 14 ++++++++++++-- openVulkanoCpp/Base/Utils.cpp | 12 ++++++++++-- openVulkanoCpp/Base/Utils.hpp | 1 + 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 55641de..c93731c 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #ifndef NO_CONSOLE_LOG @@ -182,8 +183,17 @@ namespace OpenVulkano void CustomThreadNameFormatterFlag::format(const spdlog::details::log_msg &msg, const std::tm &tmTime, spdlog::memory_buf_t &dest) { std::string threadName = OpenVulkano::Utils::GetThreadName(); - // NOTE(vb): What should be displayed if the thread name wasn't specified? - dest.append(threadName.c_str(), threadName.c_str() + threadName.length()); + if(threadName.length()) + { + dest.append(threadName.c_str(), threadName.c_str() + threadName.length()); + } + else + { + uint64_t threadId = OpenVulkano::Utils::GetThreadId(); + char buffer[64]; + snprintf(buffer, sizeof(buffer), "%" PRIu64, threadId); + dest.append(buffer, buffer + strlen(buffer)); + } } std::unique_ptr CustomThreadNameFormatterFlag::clone() const diff --git a/openVulkanoCpp/Base/Utils.cpp b/openVulkanoCpp/Base/Utils.cpp index d452509..95c2ca7 100644 --- a/openVulkanoCpp/Base/Utils.cpp +++ b/openVulkanoCpp/Base/Utils.cpp @@ -43,14 +43,22 @@ namespace OpenVulkano return str; #else // NOTE(vb): Accoring to linux man page size of this array must be _at least_ 16 bytes... - // But I don't know whether is it applicable to have the buffer of bigger size - char threadName[16]; + char threadName[64]; pthread_getname_np(pthread_self(), threadName, sizeof(threadName)); std::string str = threadName; return str; #endif } + uint64_t Utils::GetThreadId() + { +#ifdef _MSC_VER + return (uint64_t)::GetThreadId(::GetCurrentThread()); +#else + return (uint64_t)pthread_self(); +#endif + } + Array Utils::ReadFile(const std::string& filePath, bool emptyOnMissing) { std::ifstream file(filePath, std::ios::ate | std::ios::binary); diff --git a/openVulkanoCpp/Base/Utils.hpp b/openVulkanoCpp/Base/Utils.hpp index 9c803bd..c6fbdab 100644 --- a/openVulkanoCpp/Base/Utils.hpp +++ b/openVulkanoCpp/Base/Utils.hpp @@ -20,6 +20,7 @@ namespace OpenVulkano public: static void SetThreadName(const std::string& name); static std::string GetThreadName(); + static uint64_t GetThreadId(); static inline std::vector toCString(const std::vector& values) {