From ef8b3623f5759af03a7d35e147a4f890366d440f Mon Sep 17 00:00:00 2001
From: ameerj <52414509+ameerj@users.noreply.github.com>
Date: Fri, 29 Jan 2021 18:41:22 -0500
Subject: [PATCH] analog_from_button: Fix update_thread.join exception

This commit aims to address an exception that occurs when trying to join the Analog object's update_thread.

By using an atomic bool for the status of the update thread, we ensure its value is consistent across the threads accessing it.
---
 src/input_common/analog_from_button.cpp | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/input_common/analog_from_button.cpp b/src/input_common/analog_from_button.cpp
index 40b516f85c..07a0fa4a14 100755
--- a/src/input_common/analog_from_button.cpp
+++ b/src/input_common/analog_from_button.cpp
@@ -2,6 +2,7 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include <atomic>
 #include <chrono>
 #include <cmath>
 #include <thread>
@@ -20,13 +21,16 @@ public:
         : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
           right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_),
           modifier_angle(modifier_angle_) {
+        update_thread_running.store(true);
         update_thread = std::thread(&Analog::UpdateStatus, this);
     }
 
     ~Analog() override {
-        update_thread_running = false;
-        if (update_thread.joinable()) {
-            update_thread.join();
+        if (update_thread_running.load()) {
+            update_thread_running.store(false);
+            if (update_thread.joinable()) {
+                update_thread.join();
+            }
         }
     }
 
@@ -58,7 +62,7 @@ public:
     }
 
     void UpdateStatus() {
-        while (update_thread_running) {
+        while (update_thread_running.load()) {
             const float coef = modifier->GetStatus() ? modifier_scale : 1.0f;
 
             bool r = right->GetStatus();
@@ -160,7 +164,7 @@ private:
     float angle{};
     float amplitude{};
     std::thread update_thread;
-    bool update_thread_running{true};
+    std::atomic<bool> update_thread_running{};
 };
 
 std::unique_ptr<Input::AnalogDevice> AnalogFromButton::Create(const Common::ParamPackage& params) {