From ed8aa774bb59e7d155af95b52e9e7894c8777780 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 16 Sep 2018 00:36:20 +0300 Subject: [PATCH] Optimize logging via logs::channel Use constant-initialized severity subobjects instead of temporaries --- Utilities/Log.cpp | 2 +- Utilities/Log.h | 29 +++++++++++++---------------- rpcs3/Emu/System.cpp | 3 +-- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Utilities/Log.cpp b/Utilities/Log.cpp index 746c68a583..8204c5da05 100644 --- a/Utilities/Log.cpp +++ b/Utilities/Log.cpp @@ -239,7 +239,7 @@ void logs::listener::add(logs::listener* _new) } } -void logs::message::broadcast(const char* fmt, const fmt_type_info* sup, const u64* args) +void logs::message::broadcast(const char* fmt, const fmt_type_info* sup, const u64* args) const { // Get timestamp const u64 stamp = get_stamp(); diff --git a/Utilities/Log.h b/Utilities/Log.h index 3117ed2702..b3bf96bdc4 100644 --- a/Utilities/Log.h +++ b/Utilities/Log.h @@ -23,14 +23,17 @@ namespace logs struct channel; - // Message information (temporary data) + // Message information struct message { channel* ch; level sev; + private: // Send log message to global logger instance - void broadcast(const char*, const fmt_type_info*, const u64*); + void broadcast(const char*, const fmt_type_info*, const u64*) const; + + friend struct channel; }; class listener @@ -67,22 +70,16 @@ namespace logs { } - // Formatting function - template - SAFE_BUFFERS FORCE_INLINE void format(level sev, const char* fmt, const Args&... args) - { - if (UNLIKELY(sev <= enabled)) - { - static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make>()...}; - message{this, sev}.broadcast(fmt, type_list, fmt_args_t{fmt_unveil::get(args)...}); - } - } - #define GEN_LOG_METHOD(_sev)\ - template\ - SAFE_BUFFERS void _sev(const char* fmt, const Args&... args)\ + const message msg_##_sev{this, level::_sev};\ + template \ + void _sev(const char* fmt, const Args&... args)\ {\ - return format(level::_sev, fmt, args...);\ + if (UNLIKELY(level::_sev <= enabled))\ + {\ + static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make>()...};\ + msg_##_sev.broadcast(fmt, type_list, fmt_args_t{fmt_unveil::get(args)...});\ + }\ } GEN_LOG_METHOD(fatal) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 6f91476440..81f4ccbebc 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1465,7 +1465,6 @@ s32 error_code::error_report(const fmt_type_info* sup, u64 arg, const fmt_type_i } logs::channel* channel = &logs::GENERAL; - logs::level level = logs::level::error; const char* func = "Unknown function"; if (auto thread = get_current_cpu_thread()) @@ -1490,7 +1489,7 @@ s32 error_code::error_report(const fmt_type_info* sup, u64 arg, const fmt_type_i if (stat <= 3) { - channel->format(level, "%s [%u]", g_tls_error_str, stat); + channel->error("%s [%u]", g_tls_error_str, stat); } return static_cast(arg);