yuzu-emu
/
yuzu
Archived
1
0
Fork 0

input_common/mouse_input: Fix data race

Fix data race using std::jthread and std::stop_token.
This commit is contained in:
Rodrigo Locatti 2021-06-22 02:31:39 -03:00
parent 0485b8e84b
commit 0a39163a90
2 changed files with 10 additions and 12 deletions

View File

@ -2,25 +2,23 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include <stop_token>
#include <thread>
#include "common/settings.h" #include "common/settings.h"
#include "input_common/mouse/mouse_input.h" #include "input_common/mouse/mouse_input.h"
namespace MouseInput { namespace MouseInput {
Mouse::Mouse() { Mouse::Mouse() {
update_thread = std::thread(&Mouse::UpdateThread, this); update_thread = std::jthread([this](std::stop_token stop_token) { UpdateThread(stop_token); });
} }
Mouse::~Mouse() { Mouse::~Mouse() = default;
update_thread_running = false;
if (update_thread.joinable()) {
update_thread.join();
}
}
void Mouse::UpdateThread() { void Mouse::UpdateThread(std::stop_token stop_token) {
constexpr int update_time = 10; constexpr int update_time = 10;
while (update_thread_running) { while (!stop_token.stop_requested()) {
for (MouseInfo& info : mouse_info) { for (MouseInfo& info : mouse_info) {
const Common::Vec3f angular_direction{ const Common::Vec3f angular_direction{
-info.tilt_direction.y, -info.tilt_direction.y,

View File

@ -6,6 +6,7 @@
#include <array> #include <array>
#include <mutex> #include <mutex>
#include <stop_token>
#include <thread> #include <thread>
#include "common/common_types.h" #include "common/common_types.h"
@ -85,7 +86,7 @@ public:
[[nodiscard]] const MouseData& GetMouseState(std::size_t button) const; [[nodiscard]] const MouseData& GetMouseState(std::size_t button) const;
private: private:
void UpdateThread(); void UpdateThread(std::stop_token stop_token);
void UpdateYuzuSettings(); void UpdateYuzuSettings();
void StopPanning(); void StopPanning();
@ -105,12 +106,11 @@ private:
u16 buttons{}; u16 buttons{};
u16 toggle_buttons{}; u16 toggle_buttons{};
u16 lock_buttons{}; u16 lock_buttons{};
std::thread update_thread; std::jthread update_thread;
MouseButton last_button{MouseButton::Undefined}; MouseButton last_button{MouseButton::Undefined};
std::array<MouseInfo, 7> mouse_info; std::array<MouseInfo, 7> mouse_info;
Common::SPSCQueue<MouseStatus> mouse_queue; Common::SPSCQueue<MouseStatus> mouse_queue;
bool configuring{false}; bool configuring{false};
bool update_thread_running{true};
int mouse_panning_timout{}; int mouse_panning_timout{};
}; };
} // namespace MouseInput } // namespace MouseInput