LogManager: remove per-container listeners

This commit is contained in:
Michael Maltese 2017-07-07 15:23:47 -07:00
parent 546fa628fb
commit 18da6dee8e
4 changed files with 21 additions and 78 deletions

View File

@ -8,7 +8,6 @@
#include <ostream> #include <ostream>
#include <string> #include <string>
#include "Common/BitSet.h"
#include "Common/CommonPaths.h" #include "Common/CommonPaths.h"
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
#include "Common/IniFile.h" #include "Common/IniFile.h"
@ -58,19 +57,12 @@ public:
std::string GetShortName() const { return m_short_name; } std::string GetShortName() const { return m_short_name; }
std::string GetFullName() const { return m_full_name; } std::string GetFullName() const { return m_full_name; }
void AddListener(LogListener::LISTENER id) { m_listener_ids[id] = 1; }
void RemoveListener(LogListener::LISTENER id) { m_listener_ids[id] = 0; }
bool IsEnabled() const { return m_enable; } bool IsEnabled() const { return m_enable; }
void SetEnable(bool enable) { m_enable = enable; } void SetEnable(bool enable) { m_enable = enable; }
bool HasListeners() const { return bool(m_listener_ids); }
typedef class BitSet32::Iterator iterator;
iterator begin() const { return m_listener_ids.begin(); }
iterator end() const { return m_listener_ids.end(); }
private: private:
std::string m_full_name; std::string m_full_name;
std::string m_short_name; std::string m_short_name;
bool m_enable; bool m_enable;
BitSet32 m_listener_ids;
}; };
void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, int line, void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, int line,
@ -169,18 +161,15 @@ LogManager::LogManager()
verbosity = MAX_LOGLEVEL; verbosity = MAX_LOGLEVEL;
SetLogLevel(static_cast<LogTypes::LOG_LEVELS>(verbosity)); SetLogLevel(static_cast<LogTypes::LOG_LEVELS>(verbosity));
EnableListener(LogListener::FILE_LISTENER, write_file);
EnableListener(LogListener::CONSOLE_LISTENER, write_console);
EnableListener(LogListener::LOG_WINDOW_LISTENER, write_window);
for (LogContainer* container : m_log) for (LogContainer* container : m_log)
{ {
bool enable; bool enable;
logs->Get(container->GetShortName(), &enable, false); logs->Get(container->GetShortName(), &enable, false);
container->SetEnable(enable); container->SetEnable(enable);
if (enable && write_file)
container->AddListener(LogListener::FILE_LISTENER);
if (enable && write_console)
container->AddListener(LogListener::CONSOLE_LISTENER);
if (enable && write_window)
container->AddListener(LogListener::LOG_WINDOW_LISTENER);
} }
m_path_cutoff_point = DeterminePathCutOffPoint(); m_path_cutoff_point = DeterminePathCutOffPoint();
@ -208,7 +197,7 @@ void LogManager::LogWithFullPath(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE
char temp[MAX_MSGLEN]; char temp[MAX_MSGLEN];
LogContainer* log = m_log[type]; LogContainer* log = m_log[type];
if (!log->IsEnabled() || level > GetLogLevel() || !log->HasListeners()) if (!log->IsEnabled() || level > GetLogLevel() || !static_cast<bool>(m_listener_ids))
return; return;
CharArrayFromFormatV(temp, MAX_MSGLEN, format, args); CharArrayFromFormatV(temp, MAX_MSGLEN, format, args);
@ -217,7 +206,7 @@ void LogManager::LogWithFullPath(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE
"%s %s:%u %c[%s]: %s\n", Common::Timer::GetTimeFormatted().c_str(), file, line, "%s %s:%u %c[%s]: %s\n", Common::Timer::GetTimeFormatted().c_str(), file, line,
LogTypes::LOG_LEVEL_TO_CHAR[(int)level], log->GetShortName().c_str(), temp); LogTypes::LOG_LEVEL_TO_CHAR[(int)level], log->GetShortName().c_str(), temp);
for (auto listener_id : *log) for (auto listener_id : m_listener_ids)
if (m_listeners[listener_id]) if (m_listeners[listener_id])
m_listeners[listener_id]->Log(level, msg.c_str()); m_listeners[listener_id]->Log(level, msg.c_str());
} }
@ -257,14 +246,14 @@ void LogManager::RegisterListener(LogListener::LISTENER id, LogListener* listene
m_listeners[id] = listener; m_listeners[id] = listener;
} }
void LogManager::AddListener(LogTypes::LOG_TYPE type, LogListener::LISTENER id) void LogManager::EnableListener(LogListener::LISTENER id, bool enable)
{ {
m_log[type]->AddListener(id); m_listener_ids[id] = enable;
} }
void LogManager::RemoveListener(LogTypes::LOG_TYPE type, LogListener::LISTENER id) bool LogManager::IsListenerEnabled(LogListener::LISTENER id) const
{ {
m_log[type]->RemoveListener(id); return m_listener_ids[id];
} }
// Singleton. Ugh. // Singleton. Ugh.

View File

@ -8,6 +8,7 @@
#include <cstdarg> #include <cstdarg>
#include <string> #include <string>
#include "Common/BitSet.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Common/NonCopyable.h" #include "Common/NonCopyable.h"
@ -50,9 +51,10 @@ public:
std::string GetShortName(LogTypes::LOG_TYPE type) const; std::string GetShortName(LogTypes::LOG_TYPE type) const;
std::string GetFullName(LogTypes::LOG_TYPE type) const; std::string GetFullName(LogTypes::LOG_TYPE type) const;
void RegisterListener(LogListener::LISTENER id, LogListener* listener); void RegisterListener(LogListener::LISTENER id, LogListener* listener);
void AddListener(LogTypes::LOG_TYPE type, LogListener::LISTENER id); void EnableListener(LogListener::LISTENER id, bool enable);
void RemoveListener(LogTypes::LOG_TYPE type, LogListener::LISTENER id); bool IsListenerEnabled(LogListener::LISTENER id) const;
private: private:
LogManager(); LogManager();
@ -61,5 +63,6 @@ private:
LogTypes::LOG_LEVELS m_level; LogTypes::LOG_LEVELS m_level;
LogContainer* m_log[LogTypes::NUMBER_OF_LOGS]; LogContainer* m_log[LogTypes::NUMBER_OF_LOGS];
std::array<LogListener*, LogListener::NUMBER_OF_LISTENERS> m_listeners{}; std::array<LogListener*, LogListener::NUMBER_OF_LISTENERS> m_listeners{};
BitSet32 m_listener_ids;
size_t m_path_cutoff_point = 0; size_t m_path_cutoff_point = 0;
}; };

View File

@ -163,47 +163,20 @@ void LogConfigWindow::OnVerbosityChange(wxCommandEvent& event)
void LogConfigWindow::OnWriteFileChecked(wxCommandEvent& event) void LogConfigWindow::OnWriteFileChecked(wxCommandEvent& event)
{ {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) m_writeFile = event.IsChecked();
{ m_LogManager->EnableListener(LogListener::FILE_LISTENER, m_writeFile);
m_writeFile = event.IsChecked();
if (m_checks->IsChecked(i))
{
if (m_writeFile)
m_LogManager->AddListener((LogTypes::LOG_TYPE)i, LogListener::FILE_LISTENER);
else
m_LogManager->RemoveListener((LogTypes::LOG_TYPE)i, LogListener::FILE_LISTENER);
}
}
} }
void LogConfigWindow::OnWriteConsoleChecked(wxCommandEvent& event) void LogConfigWindow::OnWriteConsoleChecked(wxCommandEvent& event)
{ {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) m_writeConsole = event.IsChecked();
{ m_LogManager->EnableListener(LogListener::CONSOLE_LISTENER, m_writeConsole);
m_writeConsole = event.IsChecked();
if (m_checks->IsChecked(i))
{
if (m_writeConsole)
m_LogManager->AddListener((LogTypes::LOG_TYPE)i, LogListener::CONSOLE_LISTENER);
else
m_LogManager->RemoveListener((LogTypes::LOG_TYPE)i, LogListener::CONSOLE_LISTENER);
}
}
} }
void LogConfigWindow::OnWriteWindowChecked(wxCommandEvent& event) void LogConfigWindow::OnWriteWindowChecked(wxCommandEvent& event)
{ {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) m_writeWindow = event.IsChecked();
{ m_LogManager->EnableListener(LogListener::LOG_WINDOW_LISTENER, m_writeWindow);
m_writeWindow = event.IsChecked();
if (m_checks->IsChecked(i))
{
if (m_writeWindow)
m_LogManager->AddListener((LogTypes::LOG_TYPE)i, LogListener::LOG_WINDOW_LISTENER);
else
m_LogManager->RemoveListener((LogTypes::LOG_TYPE)i, LogListener::LOG_WINDOW_LISTENER);
}
}
} }
void LogConfigWindow::OnToggleAll(wxCommandEvent& WXUNUSED(event)) void LogConfigWindow::OnToggleAll(wxCommandEvent& WXUNUSED(event))
@ -217,26 +190,8 @@ void LogConfigWindow::OnToggleAll(wxCommandEvent& WXUNUSED(event))
void LogConfigWindow::ToggleLog(int _logType, bool enable) void LogConfigWindow::ToggleLog(int _logType, bool enable)
{ {
LogTypes::LOG_TYPE logType = (LogTypes::LOG_TYPE)_logType; LogTypes::LOG_TYPE logType = (LogTypes::LOG_TYPE)_logType;
m_checks->Check(_logType, enable); m_checks->Check(_logType, enable);
m_LogManager->SetEnable(logType, enable); m_LogManager->SetEnable(logType, enable);
if (enable)
{
if (m_writeWindow)
m_LogManager->AddListener(logType, LogListener::LOG_WINDOW_LISTENER);
if (m_writeFile)
m_LogManager->AddListener(logType, LogListener::FILE_LISTENER);
if (m_writeConsole)
m_LogManager->AddListener(logType, LogListener::CONSOLE_LISTENER);
}
else
{
m_LogManager->RemoveListener(logType, LogListener::LOG_WINDOW_LISTENER);
m_LogManager->RemoveListener(logType, LogListener::FILE_LISTENER);
m_LogManager->RemoveListener(logType, LogListener::CONSOLE_LISTENER);
}
} }
void LogConfigWindow::OnLogCheck(wxCommandEvent& event) void LogConfigWindow::OnLogCheck(wxCommandEvent& event)

View File

@ -133,11 +133,7 @@ void CLogWindow::RemoveAllListeners()
return; return;
m_has_listeners = false; m_has_listeners = false;
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) m_LogManager->EnableListener(LogListener::LOG_WINDOW_LISTENER, false);
{
m_LogManager->RemoveListener(static_cast<LogTypes::LOG_TYPE>(i),
LogListener::LOG_WINDOW_LISTENER);
}
} }
void CLogWindow::SaveSettings() void CLogWindow::SaveSettings()