From 8434a9e25070d9a5c207f35ccc6a9274e818bcbf Mon Sep 17 00:00:00 2001 From: cathery Date: Fri, 17 Apr 2020 12:05:32 +0300 Subject: [PATCH] Add a scoped lock for controller handler --- source/Sysmodule/source/controller_handler.cpp | 10 ++++++++++ source/Sysmodule/source/controller_handler.h | 2 ++ source/Sysmodule/source/psc_module.cpp | 1 + source/Sysmodule/source/usb_module.cpp | 2 ++ 4 files changed, 15 insertions(+) diff --git a/source/Sysmodule/source/controller_handler.cpp b/source/Sysmodule/source/controller_handler.cpp index 23fc93e..6564e47 100644 --- a/source/Sysmodule/source/controller_handler.cpp +++ b/source/Sysmodule/source/controller_handler.cpp @@ -14,6 +14,7 @@ namespace syscon::controllers constexpr size_t MaxControllerHandlersSize = 10; std::vector> controllerHandlers; bool UseAbstractedPad; + ams::os::Mutex controllerMutex; } bool IsAtControllerLimit() @@ -37,7 +38,10 @@ namespace syscon::controllers Result rc = switchHandler->Initialize(); if (R_SUCCEEDED(rc)) + { + std::scoped_lock scoped_lock(controllerMutex); controllerHandlers.push_back(std::move(switchHandler)); + } return rc; } @@ -46,6 +50,11 @@ namespace syscon::controllers { return controllerHandlers; } + + ams::os::Mutex& GetScopedLock() + { + return controllerMutex; + } /* void Remove(std::function func) { @@ -61,6 +70,7 @@ namespace syscon::controllers void Reset() { + std::scoped_lock scoped_lock(controllerMutex); controllerHandlers.clear(); } diff --git a/source/Sysmodule/source/controller_handler.h b/source/Sysmodule/source/controller_handler.h index 440dd99..584c0f6 100644 --- a/source/Sysmodule/source/controller_handler.h +++ b/source/Sysmodule/source/controller_handler.h @@ -2,6 +2,7 @@ #include "ControllerHelpers.h" #include "SwitchVirtualGamepadHandler.h" +#include namespace syscon::controllers { @@ -9,6 +10,7 @@ namespace syscon::controllers Result Insert(std::unique_ptr &&controllerPtr); std::vector>& Get(); + ams::os::Mutex& GetScopedLock(); //void Remove(void Remove(bool (*func)(std::unique_ptr a)));; diff --git a/source/Sysmodule/source/psc_module.cpp b/source/Sysmodule/source/psc_module.cpp index fdaa75b..29e20e8 100644 --- a/source/Sysmodule/source/psc_module.cpp +++ b/source/Sysmodule/source/psc_module.cpp @@ -36,6 +36,7 @@ namespace syscon::psc case PscPmState_ReadySleep: case PscPmState_ReadyShutdown: usb::DestroyUsbEvents(); + controllers::Reset(); break; default: break; diff --git a/source/Sysmodule/source/usb_module.cpp b/source/Sysmodule/source/usb_module.cpp index 156a179..c27f5e6 100644 --- a/source/Sysmodule/source/usb_module.cpp +++ b/source/Sysmodule/source/usb_module.cpp @@ -119,6 +119,8 @@ namespace syscon::usb WriteToLog("Interface state was changed"); std::scoped_lock usbLock(usbMutex); + std::scoped_lock controllersLock(controllers::GetScopedLock()); + eventClear(usbHsGetInterfaceStateChangeEvent()); memset(interfaces, 0, sizeof(interfaces)); if (R_SUCCEEDED(usbHsQueryAcquiredInterfaces(interfaces, sizeof(interfaces), &total_entries)))