mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-28 11:49:06 +00:00
ControllerInterface: fix UpdateReferences() deadlock
Removed useless locks to DeviceContainer::m_devices_mutex, as they were all already protected by m_devices_population_mutex. We have no interest in blocking other threads that were potentially reading devices at the same time so this seems fine. This simplifies the code, and I've adjusted a few comments which mentioned possible deadlock that should now be totally gone. The deadlock could have happen if a thread directly called EmulatedController::UpdateReferences(), while another another thread also reached EmulatedController::UpdateReferences() within a call to ControllerInterface::UpdateDevices(), as the mentioned function locked both the DeviceContainer::m_devices_mutex and s_get_state_mutex at the same time. The deadlock was frequent on game emulation startup on Android, due to the UpdateReferences() call in InputConfig::LoadConfig() and the UI thread triggering calls to ControllerInterface::UpdateDevices(). It could also have happened on Desktop if a user pressed "Refresh Devices" manually in the UI while the input config was loading. Also brought some UpdateReferences() comments and thread safety fixes from https://github.com/dolphin-emu/dolphin/pull/9489
This commit is contained in:
parent
0b81640dd1
commit
1badceb455
3 changed files with 21 additions and 36 deletions
|
@ -18,6 +18,8 @@
|
|||
|
||||
namespace ControllerEmu
|
||||
{
|
||||
// This should theoretically be per EmulatedController instance,
|
||||
// though no EmulatedController usually run in parallel, so it makes little difference
|
||||
static std::recursive_mutex s_get_state_mutex;
|
||||
|
||||
std::string EmulatedController::GetDisplayName() const
|
||||
|
@ -77,6 +79,7 @@ void EmulatedController::UpdateSingleControlReference(const ControllerInterface&
|
|||
{
|
||||
ciface::ExpressionParser::ControlEnvironment env(devi, GetDefaultDevice(), m_expression_vars);
|
||||
|
||||
const auto lock = GetStateLock();
|
||||
ref->UpdateReference(env);
|
||||
|
||||
env.CleanUnusedVariables();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue