diff --git a/Common/Log.h b/Common/Log.h index 529e763bf1..6e51c9e111 100644 --- a/Common/Log.h +++ b/Common/Log.h @@ -78,12 +78,33 @@ enum class LogLevel : int { LVERBOSE = VERBOSE_LEVEL, }; -void GenericLog(LogLevel level, Log type, const char *file, int line, const char *fmt, ...) +struct LogChannel { +#if defined(_DEBUG) + LogLevel level = LogLevel::LDEBUG; +#else + LogLevel level = LogLevel::LDEBUG; +#endif + bool enabled = true; + + bool IsEnabled(LogLevel level) const { + if (level > this->level || !this->enabled) + return false; + return true; + } +}; + +extern bool *g_bLogEnabledSetting; +extern LogChannel g_log[(size_t)Log::NUMBER_OF_LOGS]; + +inline bool GenericLogEnabled(Log type, LogLevel level) { + return g_log[(int)type].IsEnabled(level) && (*g_bLogEnabledSetting); +} + +void GenericLog(Log type, LogLevel level, const char *file, int line, const char *fmt, ...) #ifdef __GNUC__ __attribute__((format(printf, 5, 6))) #endif ; -bool GenericLogEnabled(LogLevel level, Log type); // If you want to see verbose logs, change this to VERBOSE_LEVEL. @@ -91,9 +112,9 @@ bool GenericLogEnabled(LogLevel level, Log type); // Let the compiler optimize this out. // TODO: Compute a dynamic max level as well that can be checked here. -#define GENERIC_LOG(t, v, ...) { \ - if ((int)v <= MAX_LOGLEVEL) \ - GenericLog(v, t, __FILE__, __LINE__, __VA_ARGS__); \ +#define GENERIC_LOG(t, v, ...) \ + if ((int)v <= MAX_LOGLEVEL && GenericLogEnabled(t, v)) { \ + GenericLog(t, v, __FILE__, __LINE__, __VA_ARGS__); \ } #define ERROR_LOG(t,...) do { GENERIC_LOG(t, LogLevel::LERROR, __VA_ARGS__) } while (false) diff --git a/Common/Log/LogManager.cpp b/Common/Log/LogManager.cpp index 1231874603..95379e8d5c 100644 --- a/Common/Log/LogManager.cpp +++ b/Common/Log/LogManager.cpp @@ -41,11 +41,13 @@ #include "Common/Data/Format/IniFile.h" #include "Common/StringUtils.h" +LogChannel g_log[(size_t)Log::NUMBER_OF_LOGS]; LogManager g_logManager; const char *hleCurrentThreadName = nullptr; -bool *g_bLogEnabledSetting = nullptr; +bool g_bDummySetting = true; +bool *g_bLogEnabledSetting = &g_bDummySetting; static const char level_to_char[8] = "-NEWIDV"; @@ -59,19 +61,13 @@ static const char level_to_char[8] = "-NEWIDV"; void AndroidLog(const LogMessage &message); #endif -void GenericLog(LogLevel level, Log type, const char *file, int line, const char* fmt, ...) { - if (g_bLogEnabledSetting && !(*g_bLogEnabledSetting)) - return; +void GenericLog(Log type, LogLevel level, const char *file, int line, const char* fmt, ...) { va_list args; va_start(args, fmt); g_logManager.LogLine(level, type, file, line, fmt, args); va_end(args); } -bool GenericLogEnabled(LogLevel level, Log type) { - return (*g_bLogEnabledSetting) && g_logManager.IsEnabled(level, type); -} - // NOTE: Needs to be kept in sync with the Log enum. static const char * const g_logTypeNames[] = { "SYSTEM", @@ -127,11 +123,11 @@ void LogManager::Init(bool *enabledSetting, bool headless) { initialized_ = true; _dbg_assert_(ARRAY_SIZE(g_logTypeNames) == (size_t)Log::NUMBER_OF_LOGS); - _dbg_assert_(ARRAY_SIZE(g_logTypeNames) == ARRAY_SIZE(log_)); + _dbg_assert_(ARRAY_SIZE(g_logTypeNames) == ARRAY_SIZE(g_log)); - for (size_t i = 0; i < ARRAY_SIZE(log_); i++) { - log_[i].enabled = true; - log_[i].level = LogLevel::LINFO; + for (size_t i = 0; i < ARRAY_SIZE(g_log); i++) { + g_log[i].enabled = true; + g_log[i].level = LogLevel::LINFO; } } @@ -151,12 +147,12 @@ void LogManager::Shutdown() { ringLog_.Clear(); initialized_ = false; - for (size_t i = 0; i < ARRAY_SIZE(log_); i++) { - log_[i].enabled = true; + for (size_t i = 0; i < ARRAY_SIZE(g_log); i++) { + g_log[i].enabled = true; #if defined(_DEBUG) - log_[i].level = LogLevel::LDEBUG; + g_log[i].level = LogLevel::LDEBUG; #else - log_[i].level = LogLevel::LINFO; + g_log[i].level = LogLevel::LINFO; #endif } } @@ -217,8 +213,8 @@ void LogManager::ChangeFileLog(const Path &filename) { void LogManager::SaveConfig(Section *section) { for (int i = 0; i < (int)Log::NUMBER_OF_LOGS; i++) { - section->Set((std::string(g_logTypeNames[i]) + "Enabled"), log_[i].enabled); - section->Set((std::string(g_logTypeNames[i]) + "Level"), (int)log_[i].level); + section->Set((std::string(g_logTypeNames[i]) + "Enabled"), g_log[i].enabled); + section->Set((std::string(g_logTypeNames[i]) + "Level"), (int)g_log[i].level); } } @@ -228,8 +224,8 @@ void LogManager::LoadConfig(const Section *section, bool debugDefaults) { int level = 0; section->Get((std::string(g_logTypeNames[i]) + "Enabled"), &enabled, true); section->Get((std::string(g_logTypeNames[i]) + "Level"), &level, (int)(debugDefaults ? LogLevel::LDEBUG : LogLevel::LERROR)); - log_[i].enabled = enabled; - log_[i].level = (LogLevel)level; + g_log[i].enabled = enabled; + g_log[i].level = (LogLevel)level; } } @@ -243,9 +239,11 @@ void LogManager::SetOutputsEnabled(LogOutput outputs) { void LogManager::LogLine(LogLevel level, Log type, const char *file, int line, const char *format, va_list args) { char msgBuf[1024]; - const LogChannel &log = log_[(size_t)type]; - if (level > log.level || !log.enabled || outputs_ == (LogOutput)0) + const LogChannel &log = g_log[(size_t)type]; + if (level > log.level || !log.enabled || outputs_ == (LogOutput)0) { + // If we get here, it should have been caught earlier. return; + } LogMessage message; message.level = level; diff --git a/Common/Log/LogManager.h b/Common/Log/LogManager.h index 0a8a1b4dd7..32e9a4e5ef 100644 --- a/Common/Log/LogManager.h +++ b/Common/Log/LogManager.h @@ -73,19 +73,11 @@ private: int count_ = 0; }; -struct LogChannel { -#if defined(_DEBUG) - LogLevel level = LogLevel::LDEBUG; -#else - LogLevel level = LogLevel::LDEBUG; -#endif - bool enabled = true; -}; - class Section; class ConsoleListener; typedef void (*LogCallback)(const LogMessage &message, void *userdata); +extern bool *g_bLogEnabledSetting; class LogManager { public: @@ -111,33 +103,26 @@ public: void LogLine(LogLevel level, Log type, const char *file, int line, const char *fmt, va_list args); - bool IsEnabled(LogLevel level, Log type) const { - const LogChannel &log = log_[(size_t)type]; - if (level > log.level || !log.enabled) - return false; - return true; - } - LogChannel *GetLogChannel(Log type) { - return &log_[(size_t)type]; + return &g_log[(size_t)type]; } void SetLogLevel(Log type, LogLevel level) { - log_[(size_t)type].level = level; + g_log[(size_t)type].level = level; } void SetAllLogLevels(LogLevel level) { for (int i = 0; i < (int)Log::NUMBER_OF_LOGS; ++i) { - log_[i].level = level; + g_log[i].level = level; } } void SetEnabled(Log type, bool enable) { - log_[(size_t)type].enabled = enable; + g_log[(size_t)type].enabled = enable; } LogLevel GetLogLevel(Log type) { - return log_[(size_t)type].level; + return g_log[(size_t)type].level; } #if PPSSPP_PLATFORM(WINDOWS) @@ -172,7 +157,6 @@ private: bool initialized_ = false; - LogChannel log_[(size_t)Log::NUMBER_OF_LOGS]; #if PPSSPP_PLATFORM(WINDOWS) ConsoleListener *consoleLog_ = nullptr; #endif diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 4f7759f853..0cb3e639c7 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -1267,7 +1267,7 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param) // Save num of folder found param->idList->resultCount = (u32)validDir.size(); // Log out the listing. - if (GenericLogEnabled(LogLevel::LINFO, Log::sceUtility)) { + if (GenericLogEnabled(Log::sceUtility, LogLevel::LINFO)) { INFO_LOG(Log::sceUtility, "LIST (searchstring=%s): %d files (max: %d)", searchString.c_str(), param->idList->resultCount, maxFileCount); for (int i = 0; i < validDir.size(); i++) { INFO_LOG(Log::sceUtility, "%s: mode %08x, ctime: %s, atime: %s, mtime: %s", @@ -1387,7 +1387,7 @@ int SavedataParam::GetFilesList(SceUtilitySavedataParam *param, u32 requestAddr) entry->name[15] = '\0'; } - if (GenericLogEnabled(LogLevel::LINFO, Log::sceUtility)) { + if (GenericLogEnabled(Log::sceUtility, LogLevel::LINFO)) { INFO_LOG(Log::sceUtility, "FILES: %d files listed (+ %d system, %d secure)", fileList->resultNumNormalEntries, fileList->resultNumSystemEntries, fileList->resultNumSecureEntries); if (fileList->normalEntries.IsValid()) { for (int i = 0; i < (int)fileList->resultNumNormalEntries; i++) { diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index d61e1168f0..bea3ee683a 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -1057,13 +1057,13 @@ void hleDoLogInternal(Log t, LogLevel level, u64 res, const char *file, int line const char *kernelFlag = (funcFlags & HLE_KERNEL_SYSCALL) ? "K " : ""; if (retmask != 'v') { if (errStr) { - GenericLog(level, t, file, line, fmt, kernelFlag, errStr, funcName, formatted_args, formatted_reason); + GenericLog(t, level, file, line, fmt, kernelFlag, errStr, funcName, formatted_args, formatted_reason); } else { - GenericLog(level, t, file, line, fmt, kernelFlag, res, funcName, formatted_args, formatted_reason); + GenericLog(t, level, file, line, fmt, kernelFlag, res, funcName, formatted_args, formatted_reason); } } else { // Skipping the res argument for this format string. - GenericLog(level, t, file, line, fmt, kernelFlag, funcName, formatted_args, formatted_reason); + GenericLog(t, level, file, line, fmt, kernelFlag, funcName, formatted_args, formatted_reason); } if (reportTag) { diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index dc9304be12..c70a34e098 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -181,7 +181,7 @@ __attribute__((format(printf, 7, 8))) #endif NO_INLINE T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag, const char *reasonFmt, ...) { - if (!GenericLogEnabled(level, t)) { + if (!GenericLogEnabled(t, level)) { if (leave) { hleLeave(); } @@ -221,7 +221,7 @@ template [[nodiscard]] NO_INLINE T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag) { - if (((int)level > MAX_LOGLEVEL || !GenericLogEnabled(level, t)) && !reportTag) { + if (((int)level > MAX_LOGLEVEL || !GenericLogEnabled(t, level)) && !reportTag) { if (leave) { hleLeave(); }