Fixed crash when exiting while an AVI is being recorded.
Caused by MessageManager::_messageManager pointing to a deleted object because the renderer was already deleted by the time we tried displaying a message on the screen.
This commit is contained in:
parent
efe55a9180
commit
b6e7ce4a9b
5 changed files with 23 additions and 2 deletions
|
@ -16,6 +16,11 @@ BaseRenderer::BaseRenderer(shared_ptr<Console> console, bool registerAsMessageMa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BaseRenderer::~BaseRenderer()
|
||||||
|
{
|
||||||
|
MessageManager::UnregisterMessageManager(this);
|
||||||
|
}
|
||||||
|
|
||||||
void BaseRenderer::DisplayMessage(string title, string message)
|
void BaseRenderer::DisplayMessage(string title, string message)
|
||||||
{
|
{
|
||||||
shared_ptr<ToastInfo> toast(new ToastInfo(title, message, 4000));
|
shared_ptr<ToastInfo> toast(new ToastInfo(title, message, 4000));
|
||||||
|
|
|
@ -28,6 +28,7 @@ protected:
|
||||||
uint32_t _renderedFrameCount = 0;
|
uint32_t _renderedFrameCount = 0;
|
||||||
|
|
||||||
BaseRenderer(shared_ptr<Console> console, bool registerAsMessageManager);
|
BaseRenderer(shared_ptr<Console> console, bool registerAsMessageManager);
|
||||||
|
virtual ~BaseRenderer();
|
||||||
|
|
||||||
bool IsMessageShown();
|
bool IsMessageShown();
|
||||||
|
|
||||||
|
|
|
@ -680,14 +680,24 @@ std::unordered_map<string, string> MessageManager::_zhResources = {
|
||||||
|
|
||||||
std::list<string> MessageManager::_log;
|
std::list<string> MessageManager::_log;
|
||||||
SimpleLock MessageManager::_logLock;
|
SimpleLock MessageManager::_logLock;
|
||||||
|
SimpleLock MessageManager::_messageLock;
|
||||||
bool MessageManager::_osdEnabled = false;
|
bool MessageManager::_osdEnabled = false;
|
||||||
IMessageManager* MessageManager::_messageManager = nullptr;
|
IMessageManager* MessageManager::_messageManager = nullptr;
|
||||||
|
|
||||||
void MessageManager::RegisterMessageManager(IMessageManager* messageManager)
|
void MessageManager::RegisterMessageManager(IMessageManager* messageManager)
|
||||||
{
|
{
|
||||||
|
auto lock = _messageLock.AcquireSafe();
|
||||||
MessageManager::_messageManager = messageManager;
|
MessageManager::_messageManager = messageManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessageManager::UnregisterMessageManager(IMessageManager* messageManager)
|
||||||
|
{
|
||||||
|
auto lock = _messageLock.AcquireSafe();
|
||||||
|
if(MessageManager::_messageManager == messageManager) {
|
||||||
|
MessageManager::_messageManager = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MessageManager::SetOsdState(bool enabled)
|
void MessageManager::SetOsdState(bool enabled)
|
||||||
{
|
{
|
||||||
_osdEnabled = enabled;
|
_osdEnabled = enabled;
|
||||||
|
@ -725,6 +735,11 @@ string MessageManager::Localize(string key)
|
||||||
void MessageManager::DisplayMessage(string title, string message, string param1, string param2)
|
void MessageManager::DisplayMessage(string title, string message, string param1, string param2)
|
||||||
{
|
{
|
||||||
if(MessageManager::_messageManager) {
|
if(MessageManager::_messageManager) {
|
||||||
|
auto lock = _messageLock.AcquireSafe();
|
||||||
|
if(!MessageManager::_messageManager) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
title = Localize(title);
|
title = Localize(title);
|
||||||
message = Localize(message);
|
message = Localize(message);
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ private:
|
||||||
|
|
||||||
static bool _osdEnabled;
|
static bool _osdEnabled;
|
||||||
static SimpleLock _logLock;
|
static SimpleLock _logLock;
|
||||||
|
static SimpleLock _messageLock;
|
||||||
static std::list<string> _log;
|
static std::list<string> _log;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -30,6 +31,7 @@ public:
|
||||||
static string Localize(string key);
|
static string Localize(string key);
|
||||||
|
|
||||||
static void RegisterMessageManager(IMessageManager* messageManager);
|
static void RegisterMessageManager(IMessageManager* messageManager);
|
||||||
|
static void UnregisterMessageManager(IMessageManager* messageManager);
|
||||||
static void DisplayMessage(string title, string message, string param1 = "", string param2 = "");
|
static void DisplayMessage(string title, string message, string param1 = "", string param2 = "");
|
||||||
|
|
||||||
static void Log(string message = "");
|
static void Log(string message = "");
|
||||||
|
|
|
@ -493,8 +493,6 @@ namespace InteropEmu {
|
||||||
_console->Release(true);
|
_console->Release(true);
|
||||||
_console.reset();
|
_console.reset();
|
||||||
|
|
||||||
MessageManager::RegisterMessageManager(nullptr);
|
|
||||||
|
|
||||||
_shortcutKeyHandler.reset();
|
_shortcutKeyHandler.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue