We don't really support different listeners per log type, so let's get rid of that fiction.

This commit is contained in:
Henrik Rydgard 2017-03-17 17:57:32 +01:00
parent 38fd8c62ec
commit 1ccca2ef33
3 changed files with 47 additions and 54 deletions

View File

@ -16,12 +16,14 @@
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#include <algorithm> #include <algorithm>
#include "base/logging.h" #include "base/logging.h"
#include "util/text/utf8.h" #include "util/text/utf8.h"
#include "LogManager.h" #include "LogManager.h"
#include "ConsoleListener.h" #include "ConsoleListener.h"
#include "Timer.h" #include "Timer.h"
#include "FileUtil.h" #include "FileUtil.h"
#include "StringUtils.h"
#include "../Core/Config.h" #include "../Core/Config.h"
// Don't need to savestate this. // Don't need to savestate this.
@ -112,26 +114,27 @@ LogManager::LogManager() {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) { for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) {
log_[i]->SetEnable(true); log_[i]->SetEnable(true);
#if !defined(MOBILE_DEVICE) || defined(_DEBUG)
log_[i]->AddListener(fileLog_);
log_[i]->AddListener(consoleLog_);
#if defined(_MSC_VER) && defined(USING_WIN_UI)
if (IsDebuggerPresent() && debuggerLog_ != NULL && LOG_MSC_OUTPUTDEBUG)
log_[i]->AddListener(debuggerLog_);
#endif
log_[i]->AddListener(ringLog_);
#endif
} }
#if !defined(MOBILE_DEVICE) || defined(_DEBUG)
AddListener(fileLog_);
AddListener(consoleLog_);
#if defined(_MSC_VER) && defined(USING_WIN_UI)
if (IsDebuggerPresent() && debuggerLog_ != NULL && LOG_MSC_OUTPUTDEBUG)
AddListener(debuggerLog_);
#endif
AddListener(ringLog_);
#endif
} }
LogManager::~LogManager() { LogManager::~LogManager() {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) { for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) {
#if !defined(MOBILE_DEVICE) || defined(_DEBUG) #if !defined(MOBILE_DEVICE) || defined(_DEBUG)
if (fileLog_ != NULL) if (fileLog_ != NULL)
logManager_->RemoveListener((LogTypes::LOG_TYPE)i, fileLog_); RemoveListener(fileLog_);
logManager_->RemoveListener((LogTypes::LOG_TYPE)i, consoleLog_); RemoveListener(consoleLog_);
#if defined(_MSC_VER) && defined(USING_WIN_UI) #if defined(_MSC_VER) && defined(USING_WIN_UI)
logManager_->RemoveListener((LogTypes::LOG_TYPE)i, debuggerLog_); RemoveListener(debuggerLog_);
#endif #endif
#endif #endif
} }
@ -149,15 +152,13 @@ LogManager::~LogManager() {
void LogManager::ChangeFileLog(const char *filename) { void LogManager::ChangeFileLog(const char *filename) {
if (fileLog_ != NULL) { if (fileLog_ != NULL) {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) RemoveListener(fileLog_);
logManager_->RemoveListener((LogTypes::LOG_TYPE)i, fileLog_);
delete fileLog_; delete fileLog_;
} }
if (filename != NULL) { if (filename != NULL) {
fileLog_ = new FileLogListener(filename); fileLog_ = new FileLogListener(filename);
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) AddListener(fileLog_);
log_[i]->AddListener(fileLog_);
} }
} }
@ -181,7 +182,7 @@ void LogManager::LoadConfig(IniFile::Section *section, bool debugDefaults) {
void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char *format, va_list args) { void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char *format, va_list args) {
LogChannel *log = log_[type]; LogChannel *log = log_[type];
if (level > log->GetLevel() || !log->IsEnabled() || !log->HasListeners()) if (level > log->GetLevel() || !log->IsEnabled())
return; return;
std::lock_guard<std::mutex> lk(log_lock_); std::lock_guard<std::mutex> lk(log_lock_);
@ -231,12 +232,13 @@ void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const
msgPos[neededBytes] = '\n'; msgPos[neededBytes] = '\n';
msgPos[neededBytes + 1] = '\0'; msgPos[neededBytes + 1] = '\0';
} }
log->Trigger(level, msg);
Trigger(level, msg);
} }
bool LogManager::IsEnabled(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type) { bool LogManager::IsEnabled(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type) {
LogChannel *log = log_[type]; LogChannel *log = log_[type];
if (level > log->GetLevel() || !log->IsEnabled() || !log->HasListeners()) if (level > log->GetLevel() || !log->IsEnabled())
return false; return false;
return true; return true;
} }
@ -251,8 +253,8 @@ void LogManager::Shutdown() {
} }
LogChannel::LogChannel(const char* shortName) LogChannel::LogChannel(const char* shortName)
: enable_(false), m_hasListeners(false) { : enable_(false) {
strncpy(m_shortName, shortName, 32); truncate_cpy(m_shortName, shortName);
#if defined(_DEBUG) #if defined(_DEBUG)
level_ = LogTypes::LDEBUG; level_ = LogTypes::LDEBUG;
#else #else
@ -261,19 +263,19 @@ LogChannel::LogChannel(const char* shortName)
} }
// LogContainer // LogContainer
void LogChannel::AddListener(LogListener *listener) { void LogManager::AddListener(LogListener *listener) {
std::lock_guard<std::mutex> lk(m_listeners_lock); std::lock_guard<std::mutex> lk(m_listeners_lock);
m_listeners.insert(listener); m_listeners.insert(listener);
m_hasListeners = true; m_hasListeners = true;
} }
void LogChannel::RemoveListener(LogListener *listener) { void LogManager::RemoveListener(LogListener *listener) {
std::lock_guard<std::mutex> lk(m_listeners_lock); std::lock_guard<std::mutex> lk(m_listeners_lock);
m_listeners.erase(listener); m_listeners.erase(listener);
m_hasListeners = !m_listeners.empty(); m_hasListeners = !m_listeners.empty();
} }
void LogChannel::Trigger(LogTypes::LOG_LEVELS level, const char *msg) { void LogManager::Trigger(LogTypes::LOG_LEVELS level, const char *msg) {
std::lock_guard<std::mutex> lk(m_listeners_lock); std::lock_guard<std::mutex> lk(m_listeners_lock);
std::set<LogListener*>::const_iterator i; std::set<LogListener*>::const_iterator i;

View File

@ -91,18 +91,12 @@ public:
const char* GetShortName() const { return m_shortName; } const char* GetShortName() const { return m_shortName; }
void AddListener(LogListener* listener);
void RemoveListener(LogListener* listener);
void Trigger(LogTypes::LOG_LEVELS, const char *msg);
bool IsEnabled() const { return enable_; } bool IsEnabled() const { return enable_; }
void SetEnable(bool enable) { enable_ = enable; } void SetEnable(bool enable) { enable_ = enable; }
LogTypes::LOG_LEVELS GetLevel() const { return (LogTypes::LOG_LEVELS)level_; } LogTypes::LOG_LEVELS GetLevel() const { return (LogTypes::LOG_LEVELS)level_; }
void SetLevel(LogTypes::LOG_LEVELS level) { level_ = level; } void SetLevel(LogTypes::LOG_LEVELS level) { level_ = level; }
bool HasListeners() const { return m_hasListeners; }
// Although not elegant, easy to set with a PopupMultiChoice... // Although not elegant, easy to set with a PopupMultiChoice...
int level_; int level_;
@ -110,27 +104,14 @@ public:
private: private:
char m_shortName[32]; char m_shortName[32];
std::mutex m_listeners_lock;
std::set<LogListener*> m_listeners;
bool m_hasListeners;
}; };
class ConsoleListener; class ConsoleListener;
class LogManager : NonCopyable { class LogManager : NonCopyable {
private:
LogChannel* log_[LogTypes::NUMBER_OF_LOGS];
FileLogListener *fileLog_;
ConsoleListener *consoleLog_;
DebuggerLogListener *debuggerLog_;
RingbufferLogListener *ringLog_;
static LogManager *logManager_; // Singleton. Ugh.
std::mutex log_lock_;
LogManager();
~LogManager();
public: public:
void AddListener(LogListener* listener);
void RemoveListener(LogListener* listener);
static u32 GetMaxLevel() { return MAX_LOGLEVEL; } static u32 GetMaxLevel() { return MAX_LOGLEVEL; }
static int GetNumChannels() { return LogTypes::NUMBER_OF_LOGS; } static int GetNumChannels() { return LogTypes::NUMBER_OF_LOGS; }
@ -161,14 +142,6 @@ public:
return log_[type]->GetLevel(); return log_[type]->GetLevel();
} }
void AddListener(LogTypes::LOG_TYPE type, LogListener *listener) {
log_[type]->AddListener(listener);
}
void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener) {
log_[type]->RemoveListener(listener);
}
ConsoleListener *GetConsoleListener() const { ConsoleListener *GetConsoleListener() const {
return consoleLog_; return consoleLog_;
} }
@ -196,4 +169,22 @@ public:
void SaveConfig(IniFile::Section *section); void SaveConfig(IniFile::Section *section);
void LoadConfig(IniFile::Section *section, bool debugDefaults); void LoadConfig(IniFile::Section *section, bool debugDefaults);
private:
void Trigger(LogTypes::LOG_LEVELS, const char *msg);
LogChannel* log_[LogTypes::NUMBER_OF_LOGS];
FileLogListener *fileLog_;
ConsoleListener *consoleLog_;
DebuggerLogListener *debuggerLog_;
RingbufferLogListener *ringLog_;
static LogManager *logManager_; // Singleton. Ugh.
std::mutex log_lock_;
std::mutex m_listeners_lock;
std::set<LogListener*> m_listeners;
bool m_hasListeners;
LogManager();
~LogManager();
}; };

View File

@ -301,8 +301,8 @@ int main(int argc, const char* argv[])
LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i; LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i;
logman->SetEnable(type, fullLog); logman->SetEnable(type, fullLog);
logman->SetLogLevel(type, LogTypes::LDEBUG); logman->SetLogLevel(type, LogTypes::LDEBUG);
logman->AddListener(type, printfLogger);
} }
logman->AddListener(printfLogger);
CoreParameter coreParameter; CoreParameter coreParameter;
coreParameter.cpuCore = cpuCore; coreParameter.cpuCore = cpuCore;