From b0e523a44ee7d69e6d2453325dcc669e2bcb719d Mon Sep 17 00:00:00 2001 From: capitalistspz Date: Sat, 10 Sep 2022 02:22:58 +0100 Subject: [PATCH] Fix DSUController on Linux --- src/input/CMakeLists.txt | 1 + src/input/api/DSU/DSUControllerProvider.cpp | 4 ++- src/input/api/DSU/TimeoutSocketOption.h | 40 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/input/api/DSU/TimeoutSocketOption.h diff --git a/src/input/CMakeLists.txt b/src/input/CMakeLists.txt index 47609385..23506b3d 100644 --- a/src/input/CMakeLists.txt +++ b/src/input/CMakeLists.txt @@ -43,6 +43,7 @@ target_sources(CemuInput PRIVATE api/DSU/DSUControllerProvider.h api/DSU/DSUMessages.h api/DSU/DSUMessages.cpp + api/DSU/TimeoutSocketOption.h ) # Keyboard controller diff --git a/src/input/api/DSU/DSUControllerProvider.cpp b/src/input/api/DSU/DSUControllerProvider.cpp index 4f48f9e5..066b202a 100644 --- a/src/input/api/DSU/DSUControllerProvider.cpp +++ b/src/input/api/DSU/DSUControllerProvider.cpp @@ -1,5 +1,6 @@ #include "input/api/DSU/DSUControllerProvider.h" #include "input/api/DSU/DSUController.h" +#include "input/api/DSU/TimeoutSocketOption.h" DSUControllerProvider::DSUControllerProvider() : base_type(), m_uid(rand()), m_socket(m_io_service) @@ -77,8 +78,9 @@ bool DSUControllerProvider::connect() m_socket.close(); m_socket.open(ip::udp::v4()); + // set timeout for our threads to give a chance to exit - m_socket.set_option(boost::asio::detail::socket_option::integer{200}); + m_socket.set_option(TimeoutSocketOption{200}); // reset data m_state = {}; diff --git a/src/input/api/DSU/TimeoutSocketOption.h b/src/input/api/DSU/TimeoutSocketOption.h new file mode 100644 index 00000000..c0ae8ceb --- /dev/null +++ b/src/input/api/DSU/TimeoutSocketOption.h @@ -0,0 +1,40 @@ +#pragma once + +#if BOOST_OS_WINDOWS +#include +#include // For SOL_SOCKET, SO_RCVTIMEO +using TimeoutSocketOption = boost::asio::detail::socket_option::integer; +#elif BOOST_OS_LINUX || BOOST_OS_MACOS + +// For making RCVTIME0 work on Linux and probably Mac too +class TimeoutSocketOption { + timeval m_data; +public: + constexpr explicit TimeoutSocketOption(int time_ms) + : m_data(timeval{.tv_usec = time_ms * 1000}){ + } + TimeoutSocketOption& operator=(int time_ms){ + m_data = timeval{.tv_usec = time_ms * 1000}; + return *this; + } + template + int level(const Protocol&) const { + return SOL_SOCKET; + } + + template + int name(const Protocol&) const { + return SO_RCVTIMEO; + } + + template + const timeval* data(Protocol&) const { + return &m_data; + } + + template + std::size_t size(const Protocol&) const { + return sizeof(timeval); + } +}; +#endif \ No newline at end of file