aboutsummaryrefslogtreecommitdiff
path: root/src/common/logging/backend.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-10-01 23:18:37 +0200
committercrueter <crueter@eden-emu.dev>2025-10-01 23:18:37 +0200
commit76b5d6778ec6245979a9f6963616d7fadb814d76 (patch)
treed7658bb2129cdd4d7b2491727f0b92315fd47c1e /src/common/logging/backend.cpp
parent61adc85c4ba4d87c5dcf99212a94b9d9d4a6fe14 (diff)
[common/logging] faster logging by avoiding constructing unused strings/results (and filtering first) (#2603)
basically std::string would be invoked even when the logging was filtered, then destroyed instantly, invoking malloc/free and polluting mem arenas for no good reason Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2603 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: crueter <crueter@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/common/logging/backend.cpp')
-rw-r--r--src/common/logging/backend.cpp38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 4621771090..c2cbf3f4a5 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -39,9 +39,17 @@ namespace Common::Log {
namespace {
-/**
- * Interface for logging backends.
- */
+/// @brief Trims up to and including the last of ../, ..\, src/, src\ in a string
+/// do not be fooled this isn't generating new strings on .rodata :)
+constexpr const char* TrimSourcePath(std::string_view source) {
+ const auto rfind = [source](const std::string_view match) {
+ return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size());
+ };
+ auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")});
+ return source.data() + idx;
+}
+
+/// @brief Interface for logging backends.
class Backend {
public:
virtual ~Backend() = default;
@@ -53,9 +61,7 @@ public:
virtual void Flush() = 0;
};
-/**
- * Backend that writes to stderr and with color
- */
+/// @brief Backend that writes to stderr and with color
class ColorConsoleBackend final : public Backend {
public:
explicit ColorConsoleBackend() = default;
@@ -84,9 +90,7 @@ private:
std::atomic_bool enabled{false};
};
-/**
- * Backend that writes to a file passed into the constructor
- */
+/// @brief Backend that writes to a file passed into the constructor
class FileBackend final : public Backend {
public:
explicit FileBackend(const std::filesystem::path& filename) {
@@ -248,13 +252,14 @@ public:
color_console_backend.SetEnabled(enabled);
}
+ bool CanPushEntry(Class log_class, Level log_level) const noexcept {
+ return filter.CheckMessage(log_class, log_level);
+ }
+
void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num,
- const char* function, std::string&& message) {
- if (!filter.CheckMessage(log_class, log_level)) {
- return;
- }
+ const char* function, std::string&& message) noexcept {
message_queue.EmplaceWait(
- CreateEntry(log_class, log_level, filename, line_num, function, std::move(message)));
+ CreateEntry(log_class, log_level, TrimSourcePath(filename), line_num, function, std::move(message)));
}
private:
@@ -368,8 +373,9 @@ void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
unsigned int line_num, const char* function, fmt::string_view format,
const fmt::format_args& args) {
if (!initialization_in_progress_suppress_logging) {
- Impl::Instance().PushEntry(log_class, log_level, filename, line_num, function,
- fmt::vformat(format, args));
+ auto& instance = Impl::Instance();
+ if (instance.CanPushEntry(log_class, log_level))
+ instance.PushEntry(log_class, log_level, filename, line_num, function, fmt::vformat(format, args));
}
}
} // namespace Common::Log