From 3674fddc407db1848ca5c51a0e4da87386ae6882 Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Sun, 19 May 2024 17:06:55 +0300 Subject: [PATCH 1/3] fix: refactor std::localtime out --- src/common/logging.cpp | 51 ++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/common/logging.cpp b/src/common/logging.cpp index 113ad35..c57215c 100644 --- a/src/common/logging.cpp +++ b/src/common/logging.cpp @@ -46,26 +46,35 @@ namespace display_device { { // Time { - // The stupid std::localtime function may not be thread-safe?! - static std::mutex time_mutex; - std::lock_guard lock { time_mutex }; - - const auto now { std::chrono::system_clock::now() }; - const auto now_ms { std::chrono::duration_cast(now.time_since_epoch()) }; - const auto now_s { std::chrono::duration_cast(now_ms) }; - - std::time_t time { std::chrono::system_clock::to_time_t(now) }; - const auto *localtime { std::localtime(&time) }; - if (localtime) { // It theoretically can fail for unspecified reasons... - const auto now_decimal_part { now_ms - now_s }; - - const auto old_flags { stream.flags() }; // Save formatting flags so that they can be restored... - stream << std::put_time(std::localtime(&time), "[%Y-%m-%d %H:%M:%S.") << std::setfill('0') << std::setw(3) << now_decimal_part.count() << "] "; - stream.flags(old_flags); - } - else { - stream << "[NULL TIME] "; - } + static const auto get_time { []() { + static const auto to_year_month_day { [](const auto &time) { + return std::chrono::year_month_day { std::chrono::time_point_cast(time) }; + } }; + static const auto to_hour_minute_second { [](const auto &time) { + const auto start_of_day { std::chrono::floor(time) }; + const auto time_since_start_of_day { std::chrono::round(time - start_of_day) }; + return std::chrono::hh_mm_ss { time_since_start_of_day }; + } }; + static const auto to_milliseconds { [](const auto &now, const auto &time) { + const auto now_ms { std::chrono::duration_cast(now.time_since_epoch()) }; + const auto time_s { std::chrono::duration_cast(time.time_since_epoch()) }; + return now_ms - time_s; + } }; + + const auto now { std::chrono::system_clock::now() }; + const auto time_zone { std::chrono::current_zone() }; + if (time_zone) { + const auto local_time { time_zone->to_local(now) }; + return std::make_tuple(to_year_month_day(local_time), to_hour_minute_second(local_time), to_milliseconds(now, local_time)); + } + return std::make_tuple(to_year_month_day(now), to_hour_minute_second(now), to_milliseconds(now, now)); + } }; + + const auto [year_month_day, hh_mm_ss, ms] { get_time() }; + const auto old_flags { stream.flags() }; // Save formatting flags so that they can be restored... + + stream << "[" << year_month_day << " " << hh_mm_ss << "." << std::setfill('0') << std::setw(3) << ms.count() << "] "; + stream.flags(old_flags); } // Log level @@ -85,8 +94,6 @@ namespace display_device { case LogLevel::error: stream << "ERROR: "; break; - default: - break; } // Value From 209268a2553b8bcce2c0b90e64387b7da523e96d Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Sun, 19 May 2024 17:35:27 +0300 Subject: [PATCH 2/3] remove timezone support and make GCC compile --- src/common/logging.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/common/logging.cpp b/src/common/logging.cpp index c57215c..059face 100644 --- a/src/common/logging.cpp +++ b/src/common/logging.cpp @@ -44,7 +44,7 @@ namespace display_device { std::stringstream stream; { - // Time + // Time (limited by GCC 11, so it's not pretty and no timezones are supported...) { static const auto get_time { []() { static const auto to_year_month_day { [](const auto &time) { @@ -62,18 +62,27 @@ namespace display_device { } }; const auto now { std::chrono::system_clock::now() }; - const auto time_zone { std::chrono::current_zone() }; - if (time_zone) { - const auto local_time { time_zone->to_local(now) }; - return std::make_tuple(to_year_month_day(local_time), to_hour_minute_second(local_time), to_milliseconds(now, local_time)); - } return std::make_tuple(to_year_month_day(now), to_hour_minute_second(now), to_milliseconds(now, now)); } }; const auto [year_month_day, hh_mm_ss, ms] { get_time() }; const auto old_flags { stream.flags() }; // Save formatting flags so that they can be restored... - stream << "[" << year_month_day << " " << hh_mm_ss << "." << std::setfill('0') << std::setw(3) << ms.count() << "] "; + stream << "["; + stream << std::setfill('0') << std::setw(2) << static_cast(year_month_day.year()); + stream << "-"; + stream << std::setfill('0') << std::setw(2) << static_cast(year_month_day.month()); + stream << "-"; + stream << std::setfill('0') << std::setw(2) << static_cast(year_month_day.day()); + stream << " "; + stream << std::setfill('0') << std::setw(2) << hh_mm_ss.hours().count(); + stream << ":"; + stream << std::setfill('0') << std::setw(2) << hh_mm_ss.minutes().count(); + stream << ":"; + stream << std::setfill('0') << std::setw(2) << hh_mm_ss.seconds().count(); + stream << "."; + stream << std::setfill('0') << std::setw(3) << ms.count(); + stream << "] "; stream.flags(old_flags); } From e7a4868f8b8164b6a468006551449083f93d1589 Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Sun, 19 May 2024 17:56:59 +0300 Subject: [PATCH 3/3] Simplify --- src/common/logging.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/logging.cpp b/src/common/logging.cpp index 059face..dea3c27 100644 --- a/src/common/logging.cpp +++ b/src/common/logging.cpp @@ -47,22 +47,22 @@ namespace display_device { // Time (limited by GCC 11, so it's not pretty and no timezones are supported...) { static const auto get_time { []() { - static const auto to_year_month_day { [](const auto &time) { - return std::chrono::year_month_day { std::chrono::time_point_cast(time) }; + static const auto to_year_month_day { [](const auto &now) { + return std::chrono::year_month_day { std::chrono::time_point_cast(now) }; } }; - static const auto to_hour_minute_second { [](const auto &time) { - const auto start_of_day { std::chrono::floor(time) }; - const auto time_since_start_of_day { std::chrono::round(time - start_of_day) }; + static const auto to_hour_minute_second { [](const auto &now) { + const auto start_of_day { std::chrono::floor(now) }; + const auto time_since_start_of_day { std::chrono::round(now - start_of_day) }; return std::chrono::hh_mm_ss { time_since_start_of_day }; } }; - static const auto to_milliseconds { [](const auto &now, const auto &time) { + static const auto to_milliseconds { [](const auto &now) { const auto now_ms { std::chrono::duration_cast(now.time_since_epoch()) }; - const auto time_s { std::chrono::duration_cast(time.time_since_epoch()) }; + const auto time_s { std::chrono::duration_cast(now.time_since_epoch()) }; return now_ms - time_s; } }; const auto now { std::chrono::system_clock::now() }; - return std::make_tuple(to_year_month_day(now), to_hour_minute_second(now), to_milliseconds(now, now)); + return std::make_tuple(to_year_month_day(now), to_hour_minute_second(now), to_milliseconds(now)); } }; const auto [year_month_day, hh_mm_ss, ms] { get_time() };