From e85e51e5ce9fa6e25f74f5768b00197527434d34 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sat, 9 Nov 2019 18:45:35 -0600 Subject: [PATCH] HW/WiimoteReal: Replace invalid select call with poll. --- Source/Core/Core/HW/WiimoteReal/IOLinux.cpp | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOLinux.cpp b/Source/Core/Core/HW/WiimoteReal/IOLinux.cpp index b63149b7aa..aa094aa92b 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOLinux.cpp +++ b/Source/Core/Core/HW/WiimoteReal/IOLinux.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include "Common/CommonTypes.h" @@ -223,18 +223,23 @@ void WiimoteLinux::IOWakeup() // zero = error int WiimoteLinux::IORead(u8* buf) { - fd_set fds; - FD_ZERO(&fds); - FD_SET(m_int_sock, &fds); - FD_SET(m_wakeup_pipe_r, &fds); + std::array pollfds = {}; - if (select(m_int_sock + 1, &fds, nullptr, nullptr, nullptr) == -1) + auto& poll_wakeup = pollfds[0]; + poll_wakeup.fd = m_wakeup_pipe_r; + poll_wakeup.events = POLLIN; + + auto& poll_sock = pollfds[1]; + poll_sock.fd = m_int_sock; + poll_sock.events = POLLIN; + + if (poll(pollfds.data(), pollfds.size(), -1) == -1) { - ERROR_LOG(WIIMOTE, "Unable to select Wiimote %i input socket.", m_index + 1); + ERROR_LOG(WIIMOTE, "Unable to poll Wiimote %i input socket.", m_index + 1); return -1; } - if (FD_ISSET(m_wakeup_pipe_r, &fds)) + if (poll_wakeup.revents & POLLIN) { char c; if (read(m_wakeup_pipe_r, &c, 1) != 1) @@ -244,7 +249,7 @@ int WiimoteLinux::IORead(u8* buf) return -1; } - if (!FD_ISSET(m_int_sock, &fds)) + if (!(poll_sock.revents & POLLIN)) return -1; // Read the pending message into the buffer