Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #10512 from stblr/device-change
USBv5: Fix racy device change behavior
  • Loading branch information
leoetlino committed Mar 15, 2022
2 parents d599620 + 7e7b097 commit c883ec1
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
12 changes: 8 additions & 4 deletions Source/Core/Core/IOS/USB/USBV5.cpp
Expand Up @@ -85,7 +85,7 @@ struct DeviceEntry

void USBV5ResourceManager::DoState(PointerWrap& p)
{
p.Do(m_devicechange_first_call);
p.Do(m_has_pending_changes);
u32 hook_address = m_devicechange_hook_request ? m_devicechange_hook_request->address : 0;
p.Do(hook_address);
if (hook_address != 0)
Expand Down Expand Up @@ -119,11 +119,12 @@ std::optional<IPCReply> USBV5ResourceManager::GetDeviceChange(const IOCtlRequest

std::lock_guard lk{m_devicechange_hook_address_mutex};
m_devicechange_hook_request = std::make_unique<IOCtlRequest>(request.address);
// On the first call, the reply is sent immediately (instead of on device insertion/removal)
if (m_devicechange_first_call)
// If there are pending changes, the reply is sent immediately (instead of on device
// insertion/removal).
if (m_has_pending_changes)
{
TriggerDeviceChangeReply();
m_devicechange_first_call = false;
m_has_pending_changes = false;
}
return std::nullopt;
}
Expand Down Expand Up @@ -226,7 +227,10 @@ void USBV5ResourceManager::OnDeviceChangeEnd()
void USBV5ResourceManager::TriggerDeviceChangeReply()
{
if (!m_devicechange_hook_request)
{
m_has_pending_changes = true;
return;
}

std::lock_guard lock{m_usbv5_devices_mutex};
u8 num_devices = 0;
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/Core/IOS/USB/USBV5.h
Expand Up @@ -89,7 +89,7 @@ class USBV5ResourceManager : public USBHost
void TriggerDeviceChangeReply();
virtual bool HasInterfaceNumberInIDs() const = 0;

bool m_devicechange_first_call = true;
bool m_has_pending_changes = true;
std::mutex m_devicechange_hook_address_mutex;
std::unique_ptr<IOCtlRequest> m_devicechange_hook_request;

Expand Down

0 comments on commit c883ec1

Please sign in to comment.