summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-08-17 12:15:26 +0200
committerGitHub <noreply@github.com>2020-08-17 12:15:26 +0200
commit6104018fe13eeb02dfd26f02fb42d74e77e39f16 (patch)
tree0394460f8932111eb8bcea05dd01dfbe1d041ae1 /Source/Core
parentc9945670f070bd205a05829e607e866524028b49 (diff)
parentee0d4661ab65250a1d57a3ac93dee507b4d96b5d (diff)
Merge pull request #9020 from Tilka/usb
IOS/USB: fix potential race condition
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/IOS/USB/Host.cpp8
-rw-r--r--Source/Core/Core/IOS/USB/Host.h5
-rw-r--r--Source/Core/Core/IOS/USB/OH0/OH0.cpp5
-rw-r--r--Source/Core/Core/IOS/USB/OH0/OH0.h1
-rw-r--r--Source/Core/Core/IOS/USB/USBV5.cpp5
-rw-r--r--Source/Core/Core/IOS/USB/USBV5.h1
-rw-r--r--Source/Core/Core/IOS/USB/USB_HID/HIDv4.cpp5
-rw-r--r--Source/Core/Core/IOS/USB/USB_HID/HIDv4.h1
8 files changed, 8 insertions, 23 deletions
diff --git a/Source/Core/Core/IOS/USB/Host.cpp b/Source/Core/Core/IOS/USB/Host.cpp
index f6ab6ed661..a9bb3414d4 100644
--- a/Source/Core/Core/IOS/USB/Host.cpp
+++ b/Source/Core/Core/IOS/USB/Host.cpp
@@ -31,7 +31,10 @@ USBHost::USBHost(Kernel& ios, const std::string& device_name) : Device(ios, devi
{
}
-USBHost::~USBHost() = default;
+USBHost::~USBHost()
+{
+ StopThreads();
+}
IPCCommandResult USBHost::Open(const OpenRequest& request)
{
@@ -179,9 +182,8 @@ void USBHost::StartThreads()
if (Core::WantsDeterminism())
return;
- if (!m_scan_thread_running.IsSet())
+ if (m_scan_thread_running.TestAndSet())
{
- m_scan_thread_running.Set();
m_scan_thread = std::thread([this] {
Common::SetCurrentThreadName("USB Scan Thread");
while (m_scan_thread_running.IsSet())
diff --git a/Source/Core/Core/IOS/USB/Host.h b/Source/Core/Core/IOS/USB/Host.h
index d1d0864097..3fe05e52df 100644
--- a/Source/Core/Core/IOS/USB/Host.h
+++ b/Source/Core/Core/IOS/USB/Host.h
@@ -53,13 +53,14 @@ protected:
virtual void OnDeviceChange(ChangeEvent event, std::shared_ptr<USB::Device> changed_device);
virtual void OnDeviceChangeEnd();
virtual bool ShouldAddDevice(const USB::Device& device) const;
- void StartThreads();
- void StopThreads();
IPCCommandResult HandleTransfer(std::shared_ptr<USB::Device> device, u32 request,
std::function<s32()> submit) const;
private:
+ void StartThreads();
+ void StopThreads();
+
bool AddDevice(std::unique_ptr<USB::Device> device);
bool UpdateDevices(bool always_add_hooks = false);
diff --git a/Source/Core/Core/IOS/USB/OH0/OH0.cpp b/Source/Core/Core/IOS/USB/OH0/OH0.cpp
index 39ee52dba9..a3d1f6d4b7 100644
--- a/Source/Core/Core/IOS/USB/OH0/OH0.cpp
+++ b/Source/Core/Core/IOS/USB/OH0/OH0.cpp
@@ -26,11 +26,6 @@ OH0::OH0(Kernel& ios, const std::string& device_name) : USBHost(ios, device_name
{
}
-OH0::~OH0()
-{
- StopThreads();
-}
-
IPCCommandResult OH0::Open(const OpenRequest& request)
{
if (HasFeature(m_ios.GetVersion(), Feature::NewUSB))
diff --git a/Source/Core/Core/IOS/USB/OH0/OH0.h b/Source/Core/Core/IOS/USB/OH0/OH0.h
index a898b74fc8..881eba1ed4 100644
--- a/Source/Core/Core/IOS/USB/OH0/OH0.h
+++ b/Source/Core/Core/IOS/USB/OH0/OH0.h
@@ -37,7 +37,6 @@ class OH0 final : public USBHost
{
public:
OH0(Kernel& ios, const std::string& device_name);
- ~OH0() override;
IPCCommandResult Open(const OpenRequest& request) override;
IPCCommandResult IOCtl(const IOCtlRequest& request) override;
diff --git a/Source/Core/Core/IOS/USB/USBV5.cpp b/Source/Core/Core/IOS/USB/USBV5.cpp
index f78e8e6ae7..98a5af0af8 100644
--- a/Source/Core/Core/IOS/USB/USBV5.cpp
+++ b/Source/Core/Core/IOS/USB/USBV5.cpp
@@ -86,11 +86,6 @@ struct DeviceEntry
#pragma pack(pop)
} // namespace
-USBV5ResourceManager::~USBV5ResourceManager()
-{
- StopThreads();
-}
-
void USBV5ResourceManager::DoState(PointerWrap& p)
{
p.Do(m_devicechange_first_call);
diff --git a/Source/Core/Core/IOS/USB/USBV5.h b/Source/Core/Core/IOS/USB/USBV5.h
index 49827256d0..0740057146 100644
--- a/Source/Core/Core/IOS/USB/USBV5.h
+++ b/Source/Core/Core/IOS/USB/USBV5.h
@@ -69,7 +69,6 @@ class USBV5ResourceManager : public USBHost
{
public:
using USBHost::USBHost;
- ~USBV5ResourceManager() override;
IPCCommandResult IOCtl(const IOCtlRequest& request) override = 0;
IPCCommandResult IOCtlV(const IOCtlVRequest& request) override = 0;
diff --git a/Source/Core/Core/IOS/USB/USB_HID/HIDv4.cpp b/Source/Core/Core/IOS/USB/USB_HID/HIDv4.cpp
index e205182b8e..b8513df344 100644
--- a/Source/Core/Core/IOS/USB/USB_HID/HIDv4.cpp
+++ b/Source/Core/Core/IOS/USB/USB_HID/HIDv4.cpp
@@ -26,11 +26,6 @@ USB_HIDv4::USB_HIDv4(Kernel& ios, const std::string& device_name) : USBHost(ios,
{
}
-USB_HIDv4::~USB_HIDv4()
-{
- StopThreads();
-}
-
IPCCommandResult USB_HIDv4::IOCtl(const IOCtlRequest& request)
{
request.Log(GetDeviceName(), Common::Log::IOS_USB);
diff --git a/Source/Core/Core/IOS/USB/USB_HID/HIDv4.h b/Source/Core/Core/IOS/USB/USB_HID/HIDv4.h
index eb6b6d5661..1268c21b97 100644
--- a/Source/Core/Core/IOS/USB/USB_HID/HIDv4.h
+++ b/Source/Core/Core/IOS/USB/USB_HID/HIDv4.h
@@ -22,7 +22,6 @@ class USB_HIDv4 final : public USBHost
{
public:
USB_HIDv4(Kernel& ios, const std::string& device_name);
- ~USB_HIDv4() override;
IPCCommandResult IOCtl(const IOCtlRequest& request) override;