InputCommon/ControllerInterface: Make devices mutex recursive so RemoveDevice can be used within UpdateInput.
This commit is contained in:
parent
5af2081c75
commit
4176cc77e1
|
@ -93,7 +93,7 @@ void ControllerInterface::RefreshDevices()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
m_devices.clear();
|
m_devices.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +131,7 @@ void ControllerInterface::RefreshDevices()
|
||||||
#ifdef CIFACE_USE_DUALSHOCKUDPCLIENT
|
#ifdef CIFACE_USE_DUALSHOCKUDPCLIENT
|
||||||
ciface::DualShockUDPClient::PopulateDevices();
|
ciface::DualShockUDPClient::PopulateDevices();
|
||||||
#endif
|
#endif
|
||||||
|
ciface::Wiimote::PopulateDevices();
|
||||||
|
|
||||||
m_is_populating_devices = false;
|
m_is_populating_devices = false;
|
||||||
InvokeDevicesChangedCallbacks();
|
InvokeDevicesChangedCallbacks();
|
||||||
|
@ -146,7 +147,7 @@ void ControllerInterface::Shutdown()
|
||||||
m_is_init = false;
|
m_is_init = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
|
|
||||||
for (const auto& d : m_devices)
|
for (const auto& d : m_devices)
|
||||||
{
|
{
|
||||||
|
@ -193,7 +194,7 @@ void ControllerInterface::AddDevice(std::shared_ptr<ciface::Core::Device> device
|
||||||
return;
|
return;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
|
|
||||||
const auto is_id_in_use = [&device, this](int id) {
|
const auto is_id_in_use = [&device, this](int id) {
|
||||||
return std::any_of(m_devices.begin(), m_devices.end(), [&device, &id](const auto& d) {
|
return std::any_of(m_devices.begin(), m_devices.end(), [&device, &id](const auto& d) {
|
||||||
|
@ -229,7 +230,7 @@ void ControllerInterface::AddDevice(std::shared_ptr<ciface::Core::Device> device
|
||||||
void ControllerInterface::RemoveDevice(std::function<bool(const ciface::Core::Device*)> callback)
|
void ControllerInterface::RemoveDevice(std::function<bool(const ciface::Core::Device*)> callback)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
auto it = std::remove_if(m_devices.begin(), m_devices.end(), [&callback](const auto& dev) {
|
auto it = std::remove_if(m_devices.begin(), m_devices.end(), [&callback](const auto& dev) {
|
||||||
if (callback(dev.get()))
|
if (callback(dev.get()))
|
||||||
{
|
{
|
||||||
|
@ -251,7 +252,7 @@ void ControllerInterface::UpdateInput()
|
||||||
// Don't block the UI or CPU thread (to avoid a short but noticeable frame drop)
|
// Don't block the UI or CPU thread (to avoid a short but noticeable frame drop)
|
||||||
if (m_devices_mutex.try_lock())
|
if (m_devices_mutex.try_lock())
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex, std::adopt_lock);
|
std::lock_guard lk(m_devices_mutex, std::adopt_lock);
|
||||||
for (const auto& d : m_devices)
|
for (const auto& d : m_devices)
|
||||||
d->UpdateInput();
|
d->UpdateInput();
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,7 @@ bool DeviceQualifier::operator!=(const DeviceQualifier& devq) const
|
||||||
|
|
||||||
std::shared_ptr<Device> DeviceContainer::FindDevice(const DeviceQualifier& devq) const
|
std::shared_ptr<Device> DeviceContainer::FindDevice(const DeviceQualifier& devq) const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
for (const auto& d : m_devices)
|
for (const auto& d : m_devices)
|
||||||
{
|
{
|
||||||
if (devq == d.get())
|
if (devq == d.get())
|
||||||
|
@ -192,7 +192,7 @@ std::shared_ptr<Device> DeviceContainer::FindDevice(const DeviceQualifier& devq)
|
||||||
|
|
||||||
std::vector<std::string> DeviceContainer::GetAllDeviceStrings() const
|
std::vector<std::string> DeviceContainer::GetAllDeviceStrings() const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
|
|
||||||
std::vector<std::string> device_strings;
|
std::vector<std::string> device_strings;
|
||||||
DeviceQualifier device_qualifier;
|
DeviceQualifier device_qualifier;
|
||||||
|
@ -208,7 +208,7 @@ std::vector<std::string> DeviceContainer::GetAllDeviceStrings() const
|
||||||
|
|
||||||
std::string DeviceContainer::GetDefaultDeviceString() const
|
std::string DeviceContainer::GetDefaultDeviceString() const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
if (m_devices.empty())
|
if (m_devices.empty())
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ Device::Input* DeviceContainer::FindInput(std::string_view name, const Device* d
|
||||||
return inp;
|
return inp;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lk(m_devices_mutex);
|
std::lock_guard lk(m_devices_mutex);
|
||||||
for (const auto& d : m_devices)
|
for (const auto& d : m_devices)
|
||||||
{
|
{
|
||||||
Device::Input* const i = d->FindInput(name);
|
Device::Input* const i = d->FindInput(name);
|
||||||
|
|
|
@ -198,7 +198,7 @@ public:
|
||||||
DetectInput(u32 wait_ms, const std::vector<std::string>& device_strings) const;
|
DetectInput(u32 wait_ms, const std::vector<std::string>& device_strings) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
mutable std::mutex m_devices_mutex;
|
mutable std::recursive_mutex m_devices_mutex;
|
||||||
std::vector<std::shared_ptr<Device>> m_devices;
|
std::vector<std::shared_ptr<Device>> m_devices;
|
||||||
};
|
};
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
Loading…
Reference in New Issue