X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/cf99afd4c25f733f4fe72ef780e4cd70ee25e459..148f79dce19457e24754501db6844bc363c6f3fb:/projects/stargazer/stg_timer.cpp?ds=sidebyside diff --git a/projects/stargazer/stg_timer.cpp b/projects/stargazer/stg_timer.cpp index 572b069a..7a460ddf 100644 --- a/projects/stargazer/stg_timer.cpp +++ b/projects/stargazer/stg_timer.cpp @@ -2,16 +2,26 @@ #include "stg/common.h" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include +#pragma GCC diagnostic pop + #include #include #include #include +namespace +{ + +std::jthread thread; + +} + void * StgTimer(void *); -static int nonstop; -static pthread_t thrStgTimer; static bool isTimerRunning = false; volatile time_t stgTime; @@ -33,7 +43,7 @@ const int START_TIME = 2; #endif //----------------------------------------------------------------------------- -void * StgTimer(void *) +void timer(std::stop_token token) { #ifdef STG_TIMER_DEBUG struct tm lt; @@ -70,9 +80,8 @@ sigset_t signalSet; sigfillset(&signalSet); pthread_sigmask(SIG_BLOCK, &signalSet, NULL); -nonstop = 1; isTimerRunning = true; -while (nonstop) +while (!token.stop_requested()) { #ifdef STG_TIMER_DEBUG struct timespec ts; @@ -95,30 +104,22 @@ while (nonstop) #endif } isTimerRunning = false; - -return NULL; } //----------------------------------------------------------------------------- int RunStgTimer() { -static int a = 0; isTimerRunning = false; -if (a == 0) - if (pthread_create(&thrStgTimer, NULL, &StgTimer, NULL)) - { - isTimerRunning = false; - return -1; - } +if (!thread.joinable()) + thread = std::jthread(timer); -a = 1; return 0; } //----------------------------------------------------------------------------- void StopStgTimer() { -nonstop = 0; -pthread_join(thrStgTimer, NULL); // Cleanup thread resources +thread.request_stop(); +thread.join(); printfd(__FILE__, "STG_TIMER stopped\n"); } //-----------------------------------------------------------------------------