From dde857dfb49f8822847b5f5e6be7e4be052e139f Mon Sep 17 00:00:00 2001 From: k1-801 Date: Sun, 15 Nov 2020 16:00:59 +0400 Subject: [PATCH] Tiny threads fixes & a little bit of safety --- .../CorsairLightingNodeController.cpp | 37 +++--------------- .../CorsairLightingNodeController.h | 2 + .../E131Controller/RGBController_E131.cpp | 13 ++++++- .../E131Controller/RGBController_E131.h | 3 +- .../RGBController_HyperXAlloyOrigins.cpp | 38 ++++--------------- .../RGBController_HyperXAlloyOrigins.h | 3 +- .../RGBController_HyperXKeyboard.cpp | 12 +++--- .../RGBController_HyperXKeyboard.h | 6 +-- .../RGBController_HyperXPulsefireSurge.cpp | 38 +++---------------- .../RGBController_HyperXPulsefireSurge.h | 3 +- .../RGBController_HyperXMousemat.cpp | 38 +++---------------- .../RGBController_HyperXMousemat.h | 3 +- .../PhilipsWizController.cpp | 7 +++- .../PhilipsWizController.h | 1 + .../RGBController_SteelSeriesApex.cpp | 8 ---- NetworkClient.cpp | 13 ++++++- NetworkServer.cpp | 13 +++++++ NetworkServer.h | 1 + 18 files changed, 85 insertions(+), 154 deletions(-) diff --git a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp index 5c8a23ba..92540d4d 100644 --- a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp +++ b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp @@ -11,32 +11,8 @@ #include #include -//Include thread libraries for Windows or Linux -#ifdef WIN32 -#include -#else -#include "pthread.h" -#include "unistd.h" -#endif - -//Thread functions have different types in Windows and Linux -#ifdef WIN32 -#define THREAD static void -#define THREADRETURN -#else -#define THREAD static void* -#define THREADRETURN return(NULL); -#endif - using namespace std::chrono_literals; -THREAD keepalive_thread(void *param) -{ - CorsairLightingNodeController* corsair = static_cast(param); - corsair->KeepaliveThread(); - THREADRETURN -} - CorsairLightingNodeController::CorsairLightingNodeController(hid_device* dev_handle, const char* path) { dev = dev_handle; @@ -50,21 +26,20 @@ CorsairLightingNodeController::CorsairLightingNodeController(hid_device* dev_han | to not revert back into rainbow mode. Start a thread | | to continuously send a keepalive packet every 5s | \*-----------------------------------------------------*/ -#ifdef WIN32 - _beginthread(keepalive_thread, 0, this); -#else - pthread_t thread; - pthread_create(&thread, NULL, &keepalive_thread, this); -#endif + keepalive_thread_run = 1; + keepalive_thread = new std::thread(&CorsairLightingNodeController::KeepaliveThread, this); } CorsairLightingNodeController::~CorsairLightingNodeController() { + keepalive_thread_run = 0; + keepalive_thread->join(); + delete keepalive_thread; } void CorsairLightingNodeController::KeepaliveThread() { - while(1) + while(keepalive_thread_run.load()) { if((std::chrono::steady_clock::now() - last_commit_time) > std::chrono::seconds(5)) { diff --git a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h index fd25229d..c81627c3 100644 --- a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h +++ b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h @@ -112,6 +112,8 @@ private: hid_device* dev; std::string firmware_version; std::string location; + std::thread* keepalive_thread; + std::atomic keepalive_thread_run; std::chrono::time_point last_commit_time; void SendFirmwareRequest(); diff --git a/Controllers/E131Controller/RGBController_E131.cpp b/Controllers/E131Controller/RGBController_E131.cpp index c2fa59e5..885889e3 100644 --- a/Controllers/E131Controller/RGBController_E131.cpp +++ b/Controllers/E131Controller/RGBController_E131.cpp @@ -261,12 +261,21 @@ RGBController_E131::RGBController_E131(std::vector device_list) if(keepalive_delay.count() > 0) { - KeepaliveThread = new std::thread(&RGBController_E131::KeepaliveThreadFunction, this); + keepalive_thread_run = 1; + keepalive_thread = new std::thread(&RGBController_E131::KeepaliveThreadFunction, this); + } + else + { + keepalive_thread_run = 0; + keepalive_thread = nullptr; } } RGBController_E131::~RGBController_E131() { + keepalive_thread_run = 0; + keepalive_thread->join(); + delete keepalive_thread; /*---------------------------------------------------------*\ | Delete the matrix map | \*---------------------------------------------------------*/ @@ -413,7 +422,7 @@ void RGBController_E131::DeviceUpdateMode() void RGBController_E131::KeepaliveThreadFunction() { - while(1) + while(keepalive_thread_run.load()) { if((std::chrono::steady_clock::now() - last_update_time) > ( keepalive_delay * 0.95f ) ) { diff --git a/Controllers/E131Controller/RGBController_E131.h b/Controllers/E131Controller/RGBController_E131.h index b4d6ed6c..69f2dcff 100644 --- a/Controllers/E131Controller/RGBController_E131.h +++ b/Controllers/E131Controller/RGBController_E131.h @@ -78,7 +78,8 @@ private: std::vector dest_addrs; std::vector universes; int sockfd; - std::thread * KeepaliveThread; + std::thread * keepalive_thread; + std::atomic keepalive_thread_run; std::chrono::milliseconds keepalive_delay; std::chrono::time_point last_update_time; }; diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.cpp b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.cpp index adb55f35..84016813 100644 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.cpp +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.cpp @@ -9,32 +9,8 @@ #include "RGBController_HyperXAlloyOrigins.h" -//Include thread libraries for Windows or Linux -#ifdef WIN32 -#include -#else -#include "pthread.h" -#include "unistd.h" -#endif - -//Thread functions have different types in Windows and Linux -#ifdef WIN32 -#define THREAD static void -#define THREADRETURN -#else -#define THREAD static void* -#define THREADRETURN return(NULL); -#endif - using namespace std::chrono_literals; -THREAD keepalive_thread(void *param) -{ - RGBController_HyperXAlloyOrigins* controller = static_cast(param); - controller->KeepaliveThread(); - THREADRETURN -} - //0xFFFFFFFF indicates an unused entry in matrix #define NA 0xFFFFFFFF @@ -215,16 +191,16 @@ RGBController_HyperXAlloyOrigins::RGBController_HyperXAlloyOrigins(HyperXAlloyOr | to not revert back into rainbow mode. Start a thread | | to continuously send a keepalive packet every 5s | \*-----------------------------------------------------*/ -#ifdef WIN32 - _beginthread(keepalive_thread, 0, this); -#else - pthread_t thread; - pthread_create(&thread, NULL, &keepalive_thread, this); -#endif + keepalive_thread_run = 1; + keepalive_thread = new std::thread(&RGBController_HyperXAlloyOrigins::KeepaliveThread, this); } RGBController_HyperXAlloyOrigins::~RGBController_HyperXAlloyOrigins() { + keepalive_thread_run = 0; + keepalive_thread->join(); + delete keepalive_thread; + /*---------------------------------------------------------*\ | Delete the matrix map | \*---------------------------------------------------------*/ @@ -313,7 +289,7 @@ void RGBController_HyperXAlloyOrigins::DeviceUpdateMode() void RGBController_HyperXAlloyOrigins::KeepaliveThread() { - while(1) + while(keepalive_thread_run.load()) { if(active_mode == 0) { diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.h b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.h index 9d6e76c7..8f73a517 100644 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.h +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.h @@ -34,6 +34,7 @@ public: private: HyperXAlloyOriginsController* hyperx; - + std::thread* keepalive_thread; + std::atomic keepalive_thread_run; std::chrono::time_point last_update_time; }; diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.cpp b/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.cpp index 8bb72739..721f13e5 100644 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.cpp +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.cpp @@ -230,15 +230,15 @@ RGBController_HyperXKeyboard::RGBController_HyperXKeyboard(HyperXKeyboardControl | to not revert back into rainbow mode. Start a thread | | to continuously send a keepalive packet every 5s | \*-----------------------------------------------------*/ - KeepaliveThreadRunning = true; - KeepaliveThread = new std::thread(&RGBController_HyperXKeyboard::KeepaliveThreadFunction, this); + keepalive_thread_run = true; + keepalive_thread = new std::thread(&RGBController_HyperXKeyboard::KeepaliveThreadFunction, this); } RGBController_HyperXKeyboard::~RGBController_HyperXKeyboard() { - KeepaliveThreadRunning = false; - KeepaliveThread->join(); - delete KeepaliveThread; + keepalive_thread_run = false; + keepalive_thread->join(); + delete keepalive_thread; /*---------------------------------------------------------*\ | Delete the matrix map | @@ -345,7 +345,7 @@ void RGBController_HyperXKeyboard::DeviceUpdateMode() void RGBController_HyperXKeyboard::KeepaliveThreadFunction() { - while(KeepaliveThreadRunning) + while(keepalive_thread_run) { if(active_mode == 0) { diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.h b/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.h index 1b9c3364..dab1f575 100644 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.h +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.h @@ -36,9 +36,7 @@ public: private: HyperXKeyboardController* hyperx; - - std::atomic KeepaliveThreadRunning; - std::thread* KeepaliveThread; - + std::atomic keepalive_thread_run; + std::thread* keepalive_thread; std::chrono::time_point last_update_time; }; diff --git a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.cpp b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.cpp index d31e38f3..892d1a75 100644 --- a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.cpp +++ b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.cpp @@ -9,32 +9,8 @@ #include "RGBController_HyperXPulsefireSurge.h" -//Include thread libraries for Windows or Linux -#ifdef WIN32 -#include -#else -#include "pthread.h" -#include "unistd.h" -#endif - -//Thread functions have different types in Windows and Linux -#ifdef WIN32 -#define THREAD static void -#define THREADRETURN -#else -#define THREAD static void* -#define THREADRETURN return(NULL); -#endif - using namespace std::chrono_literals; -THREAD keepalive_thread(void *param) -{ - RGBController_HyperXPulsefireSurge* controller = static_cast(param); - controller->KeepaliveThread(); - THREADRETURN -} - RGBController_HyperXPulsefireSurge::RGBController_HyperXPulsefireSurge(HyperXPulsefireSurgeController* hyperx_ptr) { hyperx = hyperx_ptr; @@ -59,17 +35,15 @@ RGBController_HyperXPulsefireSurge::RGBController_HyperXPulsefireSurge(HyperXPul | to not revert back into rainbow mode. Start a thread | | to continuously send a keepalive packet every 5s | \*-----------------------------------------------------*/ -#ifdef WIN32 - _beginthread(keepalive_thread, 0, this); -#else - pthread_t thread; - pthread_create(&thread, NULL, &keepalive_thread, this); -#endif + keepalive_thread_run = 1; + keepalive_thread = new std::thread(&RGBController_HyperXPulsefireSurge::KeepaliveThread, this); }; RGBController_HyperXPulsefireSurge::~RGBController_HyperXPulsefireSurge() { - + keepalive_thread_run = 0; + keepalive_thread->join(); + delete keepalive_thread; } void RGBController_HyperXPulsefireSurge::SetupZones() @@ -156,7 +130,7 @@ void RGBController_HyperXPulsefireSurge::DeviceUpdateMode() void RGBController_HyperXPulsefireSurge::KeepaliveThread() { - while(1) + while(keepalive_thread_run.load()) { if(active_mode == 0) { diff --git a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.h b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.h index e6cc9ec9..6973d6bd 100644 --- a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.h +++ b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.h @@ -34,6 +34,7 @@ public: private: HyperXPulsefireSurgeController* hyperx; - + std::thread* keepalive_thread; + std::atomic keepalive_thread_run; std::chrono::time_point last_update_time; }; diff --git a/Controllers/HyperXMousematController/RGBController_HyperXMousemat.cpp b/Controllers/HyperXMousematController/RGBController_HyperXMousemat.cpp index ef8fb85c..883441bb 100644 --- a/Controllers/HyperXMousematController/RGBController_HyperXMousemat.cpp +++ b/Controllers/HyperXMousematController/RGBController_HyperXMousemat.cpp @@ -9,32 +9,8 @@ #include "RGBController_HyperXMousemat.h" -//Include thread libraries for Windows or Linux -#ifdef WIN32 -#include -#else -#include "pthread.h" -#include "unistd.h" -#endif - -//Thread functions have different types in Windows and Linux -#ifdef WIN32 -#define THREAD static void -#define THREADRETURN -#else -#define THREAD static void* -#define THREADRETURN return(NULL); -#endif - using namespace std::chrono_literals; -THREAD keepalive_thread(void *param) -{ - RGBController_HyperXMousemat* controller = static_cast(param); - controller->KeepaliveThread(); - THREADRETURN -} - RGBController_HyperXMousemat::RGBController_HyperXMousemat(HyperXMousematController* hyperx_ptr) { hyperx = hyperx_ptr; @@ -59,17 +35,15 @@ RGBController_HyperXMousemat::RGBController_HyperXMousemat(HyperXMousematControl | to not revert back into rainbow mode. Start a thread | | to continuously send a keepalive packet every 5s | \*-----------------------------------------------------*/ -#ifdef WIN32 - _beginthread(keepalive_thread, 0, this); -#else - pthread_t thread; - pthread_create(&thread, NULL, &keepalive_thread, this); -#endif + keepalive_thread_run = 1; + keepalive_thread = new std::thread(&RGBController_HyperXMousemat::KeepaliveThread, this); }; RGBController_HyperXMousemat::~RGBController_HyperXMousemat() { - + keepalive_thread_run = 0; + keepalive_thread->join(); + delete keepalive_thread; } void RGBController_HyperXMousemat::SetupZones() @@ -156,7 +130,7 @@ void RGBController_HyperXMousemat::DeviceUpdateMode() void RGBController_HyperXMousemat::KeepaliveThread() { - while(1) + while(keepalive_thread_run.load()) { if(active_mode == 0) { diff --git a/Controllers/HyperXMousematController/RGBController_HyperXMousemat.h b/Controllers/HyperXMousematController/RGBController_HyperXMousemat.h index b8204532..992da17c 100644 --- a/Controllers/HyperXMousematController/RGBController_HyperXMousemat.h +++ b/Controllers/HyperXMousematController/RGBController_HyperXMousemat.h @@ -34,6 +34,7 @@ public: private: HyperXMousematController* hyperx; - + std::thread* keepalive_thread; + std::atomic keepalive_thread_run; std::chrono::time_point last_update_time; }; diff --git a/Controllers/PhilipsWizController/PhilipsWizController.cpp b/Controllers/PhilipsWizController/PhilipsWizController.cpp index b753cfdd..babfe55d 100644 --- a/Controllers/PhilipsWizController/PhilipsWizController.cpp +++ b/Controllers/PhilipsWizController/PhilipsWizController.cpp @@ -25,6 +25,7 @@ PhilipsWizController::PhilipsWizController(std::string ip) /*-----------------------------------------------------------------*\ | Start a thread to handle responses received from the Wiz device | \*-----------------------------------------------------------------*/ + ReceiveThreadRun = 1; ReceiveThread = new std::thread(&PhilipsWizController::ReceiveThreadFunction, this); /*-----------------------------------------------------------------*\ @@ -35,7 +36,9 @@ PhilipsWizController::PhilipsWizController(std::string ip) PhilipsWizController::~PhilipsWizController() { - + ReceiveThreadRun = 0; + ReceiveThread->join(); + delete ReceiveThread; } std::string PhilipsWizController::GetLocation() @@ -90,7 +93,7 @@ void PhilipsWizController::ReceiveThreadFunction() { char recv_buf[1024]; - while(1) + while(ReceiveThreadRun.load()) { /*-----------------------------------------------------------------*\ | Receive up to 1024 bytes from the device | diff --git a/Controllers/PhilipsWizController/PhilipsWizController.h b/Controllers/PhilipsWizController/PhilipsWizController.h index 3f45568f..0653c901 100644 --- a/Controllers/PhilipsWizController/PhilipsWizController.h +++ b/Controllers/PhilipsWizController/PhilipsWizController.h @@ -37,4 +37,5 @@ private: std::string location; net_port port; std::thread* ReceiveThread; + std::atomic ReceiveThreadRun; }; diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp b/Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp index 1172923a..9e7f4ffb 100644 --- a/Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp @@ -9,14 +9,6 @@ #include "RGBController_SteelSeriesApex.h" -//Include thread libraries for Windows or Linux -#ifdef WIN32 -#include -#else -#include "pthread.h" -#include "unistd.h" -#endif - using namespace std::chrono_literals; //0xFFFFFFFF indicates an unused entry in matrix diff --git a/NetworkClient.cpp b/NetworkClient.cpp index 1f40b5fc..cd24dab8 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -42,7 +42,7 @@ NetworkClient::NetworkClient(std::vector& control) : controller NetworkClient::~NetworkClient() { - delete ConnectionThread; + StopClient(); } void NetworkClient::ClientInfoChanged() @@ -145,8 +145,17 @@ void NetworkClient::StopClient() } if(ListenThread) + { ListenThread->join(); - ConnectionThread->join(); + delete ListenThread; + ListenThread = nullptr; + } + if(ConnectionThread) + { + ConnectionThread->join(); + delete ConnectionThread; + ConnectionThread = nullptr; + } /*-------------------------------------------------*\ | Client info has changed, call the callbacks | diff --git a/NetworkServer.cpp b/NetworkServer.cpp index 42e63b4f..0253c87c 100644 --- a/NetworkServer.cpp +++ b/NetworkServer.cpp @@ -37,6 +37,12 @@ NetworkServer::NetworkServer(std::vector& control) : controller { port_num = OPENRGB_SDK_PORT; server_online = false; + ConnectionThread = nullptr; +} + +NetworkServer::~NetworkServer() +{ + StopServer(); } void NetworkServer::ClientInfoChanged() @@ -214,6 +220,13 @@ void NetworkServer::StopServer() ServerClients.clear(); ServerClientsMutex.unlock(); + if(ConnectionThread) + { + ConnectionThread->join(); + delete ConnectionThread; + ConnectionThread = nullptr; + } + /*-------------------------------------------------*\ | Client info has changed, call the callbacks | \*-------------------------------------------------*/ diff --git a/NetworkServer.h b/NetworkServer.h index 3a38bdab..3ea450bd 100644 --- a/NetworkServer.h +++ b/NetworkServer.h @@ -30,6 +30,7 @@ class NetworkServer { public: NetworkServer(std::vector& control); + ~NetworkServer(); unsigned short GetPort(); bool GetOnline();