From 024a87af7ac6ddf0719e3c7fc0cac5bca3e8812d Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 5 Mar 2011 21:58:54 +0000 Subject: [PATCH] Fix the Host_GetKeyState deadlock caused by Billiard's latest changes. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7304 8ced0084-cf51-0410-be5f-012b33b47a6e --- CMakeLists.txt | 1 + Source/Core/Common/Src/Thread.h | 6 +++++- Source/Core/DolphinWX/Src/Frame.cpp | 2 +- Source/Core/DolphinWX/Src/Frame.h | 2 +- Source/Core/DolphinWX/Src/FrameTools.cpp | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35877d5d56..43cf17ff5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,6 +155,7 @@ if(OPENMP) endif() endif() if(NOT OPENMP_FOUND) + add_definitions(-Wno-unknown-pragmas) message("OpenMP parallelization disabled") endif() diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index 244a8dd2f0..ea4f8057db 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -71,6 +71,10 @@ private: class Barrier { public: + Barrier() + : m_count(2), m_waiting(0) + {} + Barrier(size_t count) : m_count(count), m_waiting(0) {} @@ -80,7 +84,7 @@ public: { std::unique_lock lk(m_mutex); - if (m_count == ++m_waiting) + if (m_count >= ++m_waiting) { m_waiting = 0; m_condvar.notify_all(); diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index ebfcc5e196..3ec80afffd 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -665,7 +665,7 @@ void CFrame::OnHostMessage(wxCommandEvent& event) break; case IDM_KEYSTATE: bKeyStateResult = wxGetKeyState(wxKeyCode(event.GetInt())); - keystate_event.Set(); + keystate_event.Wait(); break; #endif diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index 4a04aadd87..ce04148e88 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -145,7 +145,7 @@ class CFrame : public CRenderFrame #ifdef __WXGTK__ Common::Event panic_event; bool bPanicResult; - Common::Event keystate_event; + Common::Barrier keystate_event; bool bKeyStateResult; #endif diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 408325ed23..067210e2a2 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -1045,7 +1045,7 @@ void CFrame::DoStop() #ifdef __WXGTK__ // Make sure the app doesn't hang waiting on a keystate check - keystate_event.Set(); + keystate_event.Wait(); #endif BootManager::Stop();