input_common/mouse_input: Fix data race
Fix data race using std::jthread and std::stop_token.
This commit is contained in:
parent
0485b8e84b
commit
0a39163a90
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
Reference in New Issue