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)
|
||||
{
|
||||
shared_ptr<ToastInfo> toast(new ToastInfo(title, message, 4000));
|
||||
|
|
|
@ -28,6 +28,7 @@ protected:
|
|||
uint32_t _renderedFrameCount = 0;
|
||||
|
||||
BaseRenderer(shared_ptr<Console> console, bool registerAsMessageManager);
|
||||
virtual ~BaseRenderer();
|
||||
|
||||
bool IsMessageShown();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 = "");
|
||||
|
|
|
@ -492,8 +492,6 @@ namespace InteropEmu {
|
|||
|
||||
_console->Release(true);
|
||||
_console.reset();
|
||||
|
||||
MessageManager::RegisterMessageManager(nullptr);
|
||||
|
||||
_shortcutKeyHandler.reset();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue