From 71d7cd6b9df86cae9c3507063ec39acfaffa7394 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Wed, 7 Oct 2015 19:57:04 +1300 Subject: [PATCH] DolphinWX: Make UpdateLog() return in a finite time. After fixing the deadlock in #3006, it is now possible for log messages to flood in faster than UpdateLog can render them. This causes it to never return, locking up the gui thread and filling the windows message queue (which triggers the stack overflow bug in older versions of Wx) --- Source/Core/DolphinWX/LogWindow.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/Core/DolphinWX/LogWindow.cpp b/Source/Core/DolphinWX/LogWindow.cpp index 21ed3c303b..6dd6b10572 100644 --- a/Source/Core/DolphinWX/LogWindow.cpp +++ b/Source/Core/DolphinWX/LogWindow.cpp @@ -31,6 +31,8 @@ // Milliseconds between msgQueue flushes to wxTextCtrl #define UPDATETIME 200 +// Max size of msgQueue, old messages will be discarded when there are too many. +#define MSGQUEUE_MAX_SIZE 100 CLogWindow::CLogWindow(CFrame *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) @@ -279,7 +281,11 @@ void CLogWindow::UpdateLog() m_LogTimer.Stop(); - while (true) + // This function runs on the main gui thread, and needs to finish in a finite time otherwise + // the GUI will lock up, which could be an issue if new messages are flooding in faster than + // this function can render them to the screen. + // So we limit this function to processing MSGQUEUE_MAX_SIZE messages each time it's called. + for (int num = 0; num < MSGQUEUE_MAX_SIZE; num++) { u8 log_level; wxString log_msg; @@ -339,7 +345,7 @@ void CLogWindow::Log(LogTypes::LOG_LEVELS level, const char *text) { std::lock_guard lk(m_LogSection); - if (msgQueue.size() >= 100) + if (msgQueue.size() >= MSGQUEUE_MAX_SIZE) msgQueue.pop(); msgQueue.push(std::make_pair(u8(level), StrToWxStr(text)));