summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2020-10-20 20:40:06 +0200
committerGitHub <noreply@github.com>2020-10-20 20:40:06 +0200
commite03dc4d56915cb0918b59bffd4d72b869ddcd426 (patch)
tree786f9a7d0d30f0b8db2927442d9e0968154beea2 /src
parentMerge pull request #4788 from ReinUsesLisp/lockfree-host-thread (diff)
parentsdl_impl: Erase the SDLJoystick entry after removing a controller (diff)
downloadyuzu-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.cpp28
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) {