mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-06-01 07:52:37 +00:00
LogManager: Stop using manual memory management
This fixes a memory leak that would occur when the Android frontend calls LogManager::Init more than once in order to reload settings. Note that the log window listener is now owned by LogManager instead of by the frontend, making it consistent with the other log listeners.
This commit is contained in:
parent
b566e81644
commit
c8be819711
4 changed files with 39 additions and 24 deletions
|
@ -8,6 +8,7 @@
|
|||
#include <cstdarg>
|
||||
#include <cstring>
|
||||
#include <locale>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
|
@ -151,8 +152,8 @@ LogManager::LogManager()
|
|||
m_log[LogType::WII_IPC] = {"WII_IPC", "WII IPC"};
|
||||
|
||||
RegisterListener(LogListener::FILE_LISTENER,
|
||||
new FileLogListener(File::GetUserPath(F_MAINLOG_IDX)));
|
||||
RegisterListener(LogListener::CONSOLE_LISTENER, new ConsoleListener());
|
||||
std::make_unique<FileLogListener>(File::GetUserPath(F_MAINLOG_IDX)));
|
||||
RegisterListener(LogListener::CONSOLE_LISTENER, std::make_unique<ConsoleListener>());
|
||||
|
||||
// Set up log listeners
|
||||
LogLevel verbosity = Config::Get(LOGGER_VERBOSITY);
|
||||
|
@ -171,12 +172,7 @@ LogManager::LogManager()
|
|||
m_path_cutoff_point = DeterminePathCutOffPoint();
|
||||
}
|
||||
|
||||
LogManager::~LogManager()
|
||||
{
|
||||
// The log window listener pointer is owned by the GUI code.
|
||||
delete m_listeners[LogListener::CONSOLE_LISTENER];
|
||||
delete m_listeners[LogListener::FILE_LISTENER];
|
||||
}
|
||||
LogManager::~LogManager() = default;
|
||||
|
||||
void LogManager::SaveSettings()
|
||||
{
|
||||
|
@ -273,9 +269,9 @@ const char* LogManager::GetFullName(LogType type) const
|
|||
return m_log[type].m_full_name;
|
||||
}
|
||||
|
||||
void LogManager::RegisterListener(LogListener::LISTENER id, LogListener* listener)
|
||||
void LogManager::RegisterListener(LogListener::LISTENER id, std::unique_ptr<LogListener> listener)
|
||||
{
|
||||
m_listeners[id] = listener;
|
||||
m_listeners[id] = std::move(listener);
|
||||
}
|
||||
|
||||
void LogManager::EnableListener(LogListener::LISTENER id, bool enable)
|
||||
|
@ -289,23 +285,22 @@ bool LogManager::IsListenerEnabled(LogListener::LISTENER id) const
|
|||
}
|
||||
|
||||
// Singleton. Ugh.
|
||||
static LogManager* s_log_manager;
|
||||
static std::unique_ptr<LogManager> s_log_manager;
|
||||
|
||||
LogManager* LogManager::GetInstance()
|
||||
{
|
||||
return s_log_manager;
|
||||
return s_log_manager.get();
|
||||
}
|
||||
|
||||
void LogManager::Init()
|
||||
{
|
||||
s_log_manager = new LogManager();
|
||||
s_log_manager = std::unique_ptr<LogManager>(new LogManager());
|
||||
}
|
||||
|
||||
void LogManager::Shutdown()
|
||||
{
|
||||
if (s_log_manager)
|
||||
s_log_manager->SaveSettings();
|
||||
delete s_log_manager;
|
||||
s_log_manager = nullptr;
|
||||
s_log_manager.reset();
|
||||
}
|
||||
} // namespace Common::Log
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue