mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-10-07 19:03:29 +00:00
We don't really support different listeners per log type, so let's get rid of that fiction.
This commit is contained in:
parent
38fd8c62ec
commit
1ccca2ef33
@ -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;
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user