diff options
author | bunnei <bunneidev@gmail.com> | 2020-10-20 20:40:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-20 20:40:06 +0200 |
commit | e03dc4d56915cb0918b59bffd4d72b869ddcd426 (patch) | |
tree | 786f9a7d0d30f0b8db2927442d9e0968154beea2 /src | |
parent | Merge pull request #4788 from ReinUsesLisp/lockfree-host-thread (diff) | |
parent | sdl_impl: Erase the SDLJoystick entry after removing a controller (diff) | |
download | yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.tar yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.tar.gz yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.tar.bz2 yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.tar.lz yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.tar.xz yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.tar.zst yuzu-e03dc4d56915cb0918b59bffd4d72b869ddcd426.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/input_common/sdl/sdl_impl.cpp | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp index 8c2cef35d..9c3035920 100644 --- a/src/input_common/sdl/sdl_impl.cpp +++ b/src/input_common/sdl/sdl_impl.cpp @@ -273,21 +273,19 @@ void SDLState::InitJoystick(int joystick_index) { void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) { const std::string guid = GetGUID(sdl_joystick); - std::shared_ptr<SDLJoystick> found_joystick; - { - std::lock_guard lock{joystick_map_mutex}; - // This call to guid is safe since the joystick is guaranteed to be in the map - const auto& joystick_guid_list = joystick_map[guid]; - const auto joystick_it = std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(), - [&sdl_joystick](const auto& joystick) { - return joystick->GetSDLJoystick() == sdl_joystick; - }); - found_joystick = *joystick_it; - } - - // Destruct SDL_Joystick outside the lock guard because SDL can internally call the - // event callback which locks the mutex again. - found_joystick->SetSDLJoystick(nullptr, nullptr); + std::lock_guard lock{joystick_map_mutex}; + auto& joystick_guid_list = joystick_map[guid]; + auto joystick_it = std::find_if( + joystick_guid_list.begin(), joystick_guid_list.end(), + [&sdl_joystick](auto& joystick) { return joystick->GetSDLJoystick() == sdl_joystick; }); + + if (joystick_it != joystick_guid_list.end()) { + (*joystick_it)->SetSDLJoystick(nullptr, nullptr); + joystick_guid_list.erase(joystick_it); + if (joystick_guid_list.empty()) { + joystick_map.erase(guid); + } + } } void SDLState::HandleGameControllerEvent(const SDL_Event& event) { |