mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 06:09:50 -06:00
LogManager: replace set of LogListener pointers with bitset.
Mostly so we can iterate over which LogListeners are enabled without having to aquire a lock.
This commit is contained in:
@ -4,12 +4,14 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstdarg>
|
||||
#include <fstream>
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
#include <string>
|
||||
|
||||
#include "Common/BitSet.h"
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "Common/NonCopyable.h"
|
||||
#include "Common/Logging/Log.h"
|
||||
@ -17,7 +19,6 @@
|
||||
#define MAX_MESSAGES 8000
|
||||
#define MAX_MSGLEN 1024
|
||||
|
||||
|
||||
// pure virtual interface
|
||||
class LogListener
|
||||
{
|
||||
@ -25,6 +26,15 @@ public:
|
||||
virtual ~LogListener() {}
|
||||
|
||||
virtual void Log(LogTypes::LOG_LEVELS, const char *msg) = 0;
|
||||
|
||||
enum LISTENER
|
||||
{
|
||||
FILE_LISTENER = 0,
|
||||
CONSOLE_LISTENER,
|
||||
LOG_WINDOW_LISTENER,
|
||||
|
||||
NUMBER_OF_LISTENERS // Must be last
|
||||
};
|
||||
};
|
||||
|
||||
class FileLogListener : public LogListener
|
||||
@ -54,8 +64,8 @@ public:
|
||||
std::string GetShortName() const { return m_shortName; }
|
||||
std::string GetFullName() const { return m_fullName; }
|
||||
|
||||
void AddListener(LogListener* listener);
|
||||
void RemoveListener(LogListener* listener);
|
||||
void AddListener(LogListener::LISTENER id) { m_listener_ids[id] = 1; }
|
||||
void RemoveListener(LogListener::LISTENER id) { m_listener_ids[id] = 0; }
|
||||
|
||||
void Trigger(LogTypes::LOG_LEVELS, const char *msg);
|
||||
|
||||
@ -66,15 +76,18 @@ public:
|
||||
|
||||
void SetLevel(LogTypes::LOG_LEVELS level) { m_level = level; }
|
||||
|
||||
bool HasListeners() const { return !m_listeners.empty(); }
|
||||
bool HasListeners() const { return 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:
|
||||
std::string m_fullName;
|
||||
std::string m_shortName;
|
||||
bool m_enable;
|
||||
LogTypes::LOG_LEVELS m_level;
|
||||
std::mutex m_listeners_lock;
|
||||
std::set<LogListener*> m_listeners;
|
||||
BitSet32 m_listener_ids;
|
||||
};
|
||||
|
||||
class ConsoleListener;
|
||||
@ -83,9 +96,8 @@ class LogManager : NonCopyable
|
||||
{
|
||||
private:
|
||||
LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS];
|
||||
FileLogListener *m_fileLog;
|
||||
ConsoleListener *m_consoleLog;
|
||||
static LogManager *m_logManager; // Singleton. Ugh.
|
||||
std::array<LogListener*, LogListener::NUMBER_OF_LISTENERS> m_listeners;
|
||||
|
||||
LogManager();
|
||||
~LogManager();
|
||||
@ -121,24 +133,19 @@ public:
|
||||
return m_Log[type]->GetFullName();
|
||||
}
|
||||
|
||||
void AddListener(LogTypes::LOG_TYPE type, LogListener *listener)
|
||||
void RegisterListener(LogListener::LISTENER id, LogListener *listener)
|
||||
{
|
||||
m_Log[type]->AddListener(listener);
|
||||
m_listeners[id] = listener;
|
||||
}
|
||||
|
||||
void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener)
|
||||
void AddListener(LogTypes::LOG_TYPE type, LogListener::LISTENER id)
|
||||
{
|
||||
m_Log[type]->RemoveListener(listener);
|
||||
m_Log[type]->AddListener(id);
|
||||
}
|
||||
|
||||
FileLogListener *GetFileListener() const
|
||||
void RemoveListener(LogTypes::LOG_TYPE type, LogListener::LISTENER id)
|
||||
{
|
||||
return m_fileLog;
|
||||
}
|
||||
|
||||
ConsoleListener *GetConsoleListener() const
|
||||
{
|
||||
return m_consoleLog;
|
||||
m_Log[type]->RemoveListener(id);
|
||||
}
|
||||
|
||||
static LogManager* GetInstance()
|
||||
|
Reference in New Issue
Block a user