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:
Sour 2019-01-30 20:18:07 -05:00
parent efe55a9180
commit b6e7ce4a9b
5 changed files with 23 additions and 2 deletions

View file

@ -16,6 +16,11 @@ BaseRenderer::BaseRenderer(shared_ptr<Console> console, bool registerAsMessageMa
}
}
BaseRenderer::~BaseRenderer()
{
MessageManager::UnregisterMessageManager(this);
}
void BaseRenderer::DisplayMessage(string title, string message)
{
shared_ptr<ToastInfo> toast(new ToastInfo(title, message, 4000));

View file

@ -28,6 +28,7 @@ protected:
uint32_t _renderedFrameCount = 0;
BaseRenderer(shared_ptr<Console> console, bool registerAsMessageManager);
virtual ~BaseRenderer();
bool IsMessageShown();

View file

@ -680,14 +680,24 @@ std::unordered_map<string, string> MessageManager::_zhResources = {
std::list<string> MessageManager::_log;
SimpleLock MessageManager::_logLock;
SimpleLock MessageManager::_messageLock;
bool MessageManager::_osdEnabled = false;
IMessageManager* MessageManager::_messageManager = nullptr;
void MessageManager::RegisterMessageManager(IMessageManager* messageManager)
{
auto lock = _messageLock.AcquireSafe();
MessageManager::_messageManager = messageManager;
}
void MessageManager::UnregisterMessageManager(IMessageManager* messageManager)
{
auto lock = _messageLock.AcquireSafe();
if(MessageManager::_messageManager == messageManager) {
MessageManager::_messageManager = nullptr;
}
}
void MessageManager::SetOsdState(bool enabled)
{
_osdEnabled = enabled;
@ -725,6 +735,11 @@ string MessageManager::Localize(string key)
void MessageManager::DisplayMessage(string title, string message, string param1, string param2)
{
if(MessageManager::_messageManager) {
auto lock = _messageLock.AcquireSafe();
if(!MessageManager::_messageManager) {
return;
}
title = Localize(title);
message = Localize(message);

View file

@ -22,6 +22,7 @@ private:
static bool _osdEnabled;
static SimpleLock _logLock;
static SimpleLock _messageLock;
static std::list<string> _log;
public:
@ -30,6 +31,7 @@ public:
static string Localize(string key);
static void RegisterMessageManager(IMessageManager* messageManager);
static void UnregisterMessageManager(IMessageManager* messageManager);
static void DisplayMessage(string title, string message, string param1 = "", string param2 = "");
static void Log(string message = "");

View file

@ -492,8 +492,6 @@ namespace InteropEmu {
_console->Release(true);
_console.reset();
MessageManager::RegisterMessageManager(nullptr);
_shortcutKeyHandler.reset();
}