From 007a7a5859189ab7ff4d4d6b1ad127960d76eedc Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 31 Jan 2020 12:01:17 +0300 Subject: [PATCH] Fixup for LOG system. Register all channels at program initialization and allow duplicates. --- Utilities/Log.cpp | 76 ++++++---------------- Utilities/Log.h | 35 +++++----- rpcs3/Emu/Cell/Modules/cellAudioOut.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellKb.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellMouse.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellMsgDialog.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellPad.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp | 6 +- rpcs3/Emu/Cell/Modules/cellStorage.cpp | 3 +- rpcs3/Emu/Cell/Modules/cellSysCache.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellSysutilAvc.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellVideoOut.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_game.cpp | 3 +- rpcs3/Emu/Cell/Modules/sys_heap.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_libc_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_mempool.cpp | 3 +- rpcs3/Emu/Cell/Modules/sys_mmapper_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_prx_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_spinlock.cpp | 2 +- rpcs3/Emu/Cell/Modules/sys_spu_.cpp | 2 +- rpcs3/Emu/Io/usb_device.cpp | 2 +- rpcs3/rpcs3qt/log_frame.cpp | 2 +- 27 files changed, 63 insertions(+), 105 deletions(-) diff --git a/Utilities/Log.cpp b/Utilities/Log.cpp index 59126b3761..2333b9b410 100644 --- a/Utilities/Log.cpp +++ b/Utilities/Log.cpp @@ -49,7 +49,6 @@ void fmt_class_string::format(std::string& out, u64 arg) case logs::level::warning: return "Warning"; case logs::level::notice: return "Notice"; case logs::level::trace: return "Trace"; - case logs::level::_uninit: return unknown; } return unknown; @@ -94,22 +93,6 @@ namespace logs void log(logs::level sev, const char* text, std::size_t size); }; - struct channel_info - { - channel* pointer = nullptr; - level enabled = level::notice; - - void set_level(level value) - { - enabled = value; - - if (pointer) - { - pointer->enabled = value; - } - } - }; - struct stored_message { message m; @@ -128,7 +111,7 @@ namespace logs virtual void log(u64 stamp, const message& msg, const std::string& prefix, const std::string& text) override; // Channel registry - std::unordered_map channels; + std::unordered_multimap channels; // Messages for delayed listener initialization std::vector messages; @@ -174,19 +157,11 @@ namespace logs return timebase.get(); } - channel GENERAL(""); - channel LOADER("LDR"); - channel MEMORY("MEM"); - channel RSX("RSX"); - channel HLE("HLE"); - channel PPU("PPU"); - channel SPU("SPU"); - // Channel registry mutex - shared_mutex g_mutex; + static shared_mutex g_mutex; // Must be set to true in main() - atomic_t g_init{false}; + static atomic_t g_init{false}; void reset() { @@ -194,7 +169,7 @@ namespace logs for (auto&& pair : get_logger()->channels) { - pair.second.set_level(level::notice); + pair.second->enabled = level::notice; } } @@ -202,7 +177,13 @@ namespace logs { std::lock_guard lock(g_mutex); - get_logger()->channels[ch_name].set_level(value); + auto found = get_logger()->channels.equal_range(ch_name); + + while (found.first != found.second) + { + found.first->second->enabled = value; + found.first++; + } } // Must be called in main() to stop accumulating messages in g_messages @@ -211,6 +192,7 @@ namespace logs if (!g_init) { std::lock_guard lock(g_mutex); + printf("DEBUG: %zu log messages accumulated. %zu channels registered.\n", get_logger()->messages.size(), get_logger()->channels.size()); get_logger()->messages.clear(); g_init = true; } @@ -241,35 +223,20 @@ void logs::listener::add(logs::listener* _new) } } +logs::channel::channel(const char* name) + : name(name) + , enabled(level::notice) +{ + std::lock_guard lock(g_mutex); + + get_logger()->channels.emplace(name, this); +} + void logs::message::broadcast(const char* fmt, const fmt_type_info* sup, ...) const { // Get timestamp const u64 stamp = get_stamp(); - // Register channel - if (ch->enabled == level::_uninit) - { - std::lock_guard lock(g_mutex); - - auto& info = get_logger()->channels[ch->name]; - - if (info.pointer && info.pointer != ch) - { - fmt::throw_exception("logs::channel repetition: %s", ch->name); - } - else if (!info.pointer) - { - info.pointer = ch; - ch->enabled = info.enabled; - - // Check level again - if (info.enabled < sev) - { - return; - } - } - } - // Get text, extract va_args thread_local std::string text; thread_local std::vector args; @@ -662,7 +629,6 @@ void logs::file_listener::log(u64 stamp, const logs::message& msg, const std::st case level::warning: text = u8"·W "; break; case level::notice: text = u8"·! "; break; case level::trace: text = u8"·T "; break; - case level::_uninit: text = u8"· "; break; } // Print µs timestamp diff --git a/Utilities/Log.h b/Utilities/Log.h index 7752149166..9b1ae35606 100644 --- a/Utilities/Log.h +++ b/Utilities/Log.h @@ -17,8 +17,6 @@ namespace logs warning, notice, trace, // Lowest severity (usually disabled) - - _uninit = UINT_MAX, // Special value for delayed initialization }; struct channel; @@ -63,12 +61,8 @@ namespace logs // The lowest logging level enabled for this channel (used for early filtering) atomic_t enabled; - // Constant initialization: channel name - constexpr channel(const char* name) - : name(name) - , enabled(level::_uninit) - { - } + // Initialize and register channel + channel(const char* name); #define GEN_LOG_METHOD(_sev)\ const message msg_##_sev{this, level::_sev};\ @@ -93,16 +87,6 @@ namespace logs #undef GEN_LOG_METHOD }; - /* Small set of predefined channels */ - - extern channel GENERAL; - extern channel LOADER; - extern channel MEMORY; - extern channel RSX; - extern channel HLE; - extern channel PPU; - extern channel SPU; - // Log level control: set all channels to level::notice void reset(); @@ -110,10 +94,23 @@ namespace logs void set_level(const std::string&, level); } -#define LOG_CHANNEL(ch, ...) ::logs::channel ch(#ch, ##__VA_ARGS__) +#define LOG_CHANNEL(ch, ...) inline ::logs::channel ch(#ch, ##__VA_ARGS__) // Legacy: +namespace logs +{ + /* Small set of predefined channels */ + + inline channel GENERAL(""); + inline channel LOADER("LDR"); + inline channel MEMORY("MEM"); + LOG_CHANNEL(RSX); + LOG_CHANNEL(HLE); + LOG_CHANNEL(PPU); + LOG_CHANNEL(SPU); +} + #define LOG_SUCCESS(ch, fmt, ...) logs::ch.success("" fmt, ##__VA_ARGS__) #define LOG_NOTICE(ch, fmt, ...) logs::ch.notice ("" fmt, ##__VA_ARGS__) #define LOG_WARNING(ch, fmt, ...) logs::ch.warning("" fmt, ##__VA_ARGS__) diff --git a/rpcs3/Emu/Cell/Modules/cellAudioOut.cpp b/rpcs3/Emu/Cell/Modules/cellAudioOut.cpp index a83300da70..fb80997fd7 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudioOut.cpp +++ b/rpcs3/Emu/Cell/Modules/cellAudioOut.cpp @@ -3,7 +3,7 @@ #include "cellAudioOut.h" -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); template<> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellKb.cpp b/rpcs3/Emu/Cell/Modules/cellKb.cpp index 4483e974ac..39fc8f4bcb 100644 --- a/rpcs3/Emu/Cell/Modules/cellKb.cpp +++ b/rpcs3/Emu/Cell/Modules/cellKb.cpp @@ -6,7 +6,7 @@ #include "Emu/Io/KeyboardHandler.h" #include "cellKb.h" -extern logs::channel sys_io; +LOG_CHANNEL(sys_io); template<> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellMouse.cpp b/rpcs3/Emu/Cell/Modules/cellMouse.cpp index 3d320a7d05..bdfe6ae636 100644 --- a/rpcs3/Emu/Cell/Modules/cellMouse.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMouse.cpp @@ -7,7 +7,7 @@ #include "cellMouse.h" -extern logs::channel sys_io; +LOG_CHANNEL(sys_io); template<> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellMsgDialog.cpp b/rpcs3/Emu/Cell/Modules/cellMsgDialog.cpp index 96ce672d4d..49e5aba4fa 100644 --- a/rpcs3/Emu/Cell/Modules/cellMsgDialog.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMsgDialog.cpp @@ -13,7 +13,7 @@ #include "util/init_mutex.hpp" -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); template<> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index 2db169be0b..076adcb84d 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -7,7 +7,7 @@ #include "Input/pad_thread.h" #include "cellPad.h" -extern logs::channel sys_io; +LOG_CHANNEL(sys_io); template<> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp b/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp index ed6971b93d..cb0fb5b2c5 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp @@ -13,11 +13,7 @@ #include #include -//---------------------------------------------------------------------------- -// Externs -//---------------------------------------------------------------------------- - -extern logs::channel cellSpurs; +LOG_CHANNEL(cellSpurs); //---------------------------------------------------------------------------- // Function prototypes diff --git a/rpcs3/Emu/Cell/Modules/cellStorage.cpp b/rpcs3/Emu/Cell/Modules/cellStorage.cpp index a1848d0cbb..500bbf72dc 100644 --- a/rpcs3/Emu/Cell/Modules/cellStorage.cpp +++ b/rpcs3/Emu/Cell/Modules/cellStorage.cpp @@ -3,8 +3,7 @@ #include "cellSysutil.h" #include "cellStorage.h" - -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); template <> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellSysCache.cpp b/rpcs3/Emu/Cell/Modules/cellSysCache.cpp index 3077f63f2e..f5036c71f1 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysCache.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysCache.cpp @@ -8,7 +8,7 @@ #include "util/init_mutex.hpp" #include "Utilities/StrUtil.h" -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); template<> void fmt_class_string::format(std::string& out, u64 arg) diff --git a/rpcs3/Emu/Cell/Modules/cellSysutilAvc.cpp b/rpcs3/Emu/Cell/Modules/cellSysutilAvc.cpp index acfe2479a0..54a8c2bc68 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutilAvc.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysutilAvc.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); s32 cellSysutilAvcByeRequest() { diff --git a/rpcs3/Emu/Cell/Modules/cellVideoOut.cpp b/rpcs3/Emu/Cell/Modules/cellVideoOut.cpp index 4999e42dfc..0223ed4aae 100644 --- a/rpcs3/Emu/Cell/Modules/cellVideoOut.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVideoOut.cpp @@ -6,7 +6,7 @@ #include "cellVideoOut.h" -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); const extern std::unordered_map, value_hash> g_video_out_resolution_map { diff --git a/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp b/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp index 06b88e96c6..9f4034fc55 100644 --- a/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp +++ b/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp @@ -4,7 +4,7 @@ #include "cellWebBrowser.h" #include "Emu/IdManager.h" -extern logs::channel cellSysutil; +LOG_CHANNEL(cellSysutil); struct browser_info { diff --git a/rpcs3/Emu/Cell/Modules/sys_game.cpp b/rpcs3/Emu/Cell/Modules/sys_game.cpp index aa9f232af3..e4c1f9f69b 100644 --- a/rpcs3/Emu/Cell/Modules/sys_game.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_game.cpp @@ -6,7 +6,8 @@ #include "Emu/Cell/lv2/sys_process.h" #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); + extern vm::gvar g_ppu_exit_mutex; extern vm::gvar> g_ppu_atexitspawn; extern vm::gvar> g_ppu_at_Exitspawn; diff --git a/rpcs3/Emu/Cell/Modules/sys_heap.cpp b/rpcs3/Emu/Cell/Modules/sys_heap.cpp index add605b126..7f07fb8434 100644 --- a/rpcs3/Emu/Cell/Modules/sys_heap.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_heap.cpp @@ -5,7 +5,7 @@ #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); struct HeapInfo { diff --git a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp index cb8682eac8..efa562c320 100644 --- a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp @@ -5,7 +5,7 @@ #include #include -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); // cfmt implementation (TODO) diff --git a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp index 15c4e9d84b..9fc1049240 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwcond_.cpp @@ -9,7 +9,7 @@ #include "Emu/Cell/lv2/sys_cond.h" #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); error_code sys_lwcond_create(ppu_thread& ppu, vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr) { diff --git a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp index 61cd194295..e455ef4126 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp @@ -10,7 +10,7 @@ #include -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); error_code sys_lwmutex_create(ppu_thread& ppu, vm::ptr lwmutex, vm::ptr attr) { diff --git a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp index 66db129ff5..1868912d32 100644 --- a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp @@ -11,8 +11,7 @@ #include "sysPrxForUser.h" - -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); using sys_mempool_t = u32; diff --git a/rpcs3/Emu/Cell/Modules/sys_mmapper_.cpp b/rpcs3/Emu/Cell/Modules/sys_mmapper_.cpp index b0a409bdc2..9c693a4194 100644 --- a/rpcs3/Emu/Cell/Modules/sys_mmapper_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_mmapper_.cpp @@ -2,7 +2,7 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_mmapper.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); s32 sys_mmapper_allocate_memory(ppu_thread& ppu, u32 size, u64 flags, vm::ptr mem_id) { diff --git a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp index 9da2bea77e..6f29599542 100644 --- a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp @@ -9,7 +9,7 @@ #include "Emu/Cell/lv2/sys_mutex.h" #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); vm::gvar g_ppu_atexit_lwm; vm::gvar[8]> g_ppu_atexit; diff --git a/rpcs3/Emu/Cell/Modules/sys_prx_.cpp b/rpcs3/Emu/Cell/Modules/sys_prx_.cpp index c969d57530..ef3bdaadc8 100644 --- a/rpcs3/Emu/Cell/Modules/sys_prx_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_prx_.cpp @@ -6,7 +6,7 @@ #include "Emu/Cell/lv2/sys_prx.h" #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); extern vm::gvar g_ppu_prx_lwm; diff --git a/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp b/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp index 87e82f8d46..7ec04abc3a 100644 --- a/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp @@ -4,7 +4,7 @@ #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); s32 sys_rsxaudio_close_connection() { diff --git a/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp b/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp index 2f7276645f..c1d90ad869 100644 --- a/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp @@ -4,7 +4,7 @@ #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); void sys_spinlock_initialize(vm::ptr> lock) { diff --git a/rpcs3/Emu/Cell/Modules/sys_spu_.cpp b/rpcs3/Emu/Cell/Modules/sys_spu_.cpp index 9c01ca8404..496f9683cf 100644 --- a/rpcs3/Emu/Cell/Modules/sys_spu_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_spu_.cpp @@ -8,7 +8,7 @@ #include "Loader/ELF.h" #include "sysPrxForUser.h" -extern logs::channel sysPrxForUser; +LOG_CHANNEL(sysPrxForUser); spu_printf_cb_t g_spu_printf_agcb; spu_printf_cb_t g_spu_printf_dgcb; diff --git a/rpcs3/Emu/Io/usb_device.cpp b/rpcs3/Emu/Io/usb_device.cpp index 13d0175c96..7aaf2a4a2b 100644 --- a/rpcs3/Emu/Io/usb_device.cpp +++ b/rpcs3/Emu/Io/usb_device.cpp @@ -7,7 +7,7 @@ #include "Emu/Io/usb_device.h" #include -extern logs::channel sys_usbd; +LOG_CHANNEL(sys_usbd); extern void LIBUSB_CALL callback_transfer(struct libusb_transfer* transfer); diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 4daa93f6c4..336ff57f27 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -24,7 +24,7 @@ constexpr auto qstr = QString::fromStdString; struct gui_listener : logs::listener { - atomic_t enabled{logs::level::_uninit}; + atomic_t enabled{logs::level{UINT_MAX}}; struct packet_t {