X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/68f936fcd7ace53bd67ba4953d0638daf2c463e6..a91e9542b384905187890f161d4da5396996fcfd:/projects/stargazer/stg_timer.cpp diff --git a/projects/stargazer/stg_timer.cpp b/projects/stargazer/stg_timer.cpp index d39c61db..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; @@ -24,7 +34,7 @@ const int TIME_SPEED = 1; 10 - 10x speed */ -const int START_TIME = 0; +const int START_TIME = 2; /* 0 - as is 1 - start before new day (3 min before) 29.11.2005 23:57:00 @@ -33,17 +43,18 @@ const int START_TIME = 0; #endif //----------------------------------------------------------------------------- -void * StgTimer(void *) +void timer(std::stop_token token) { #ifdef STG_TIMER_DEBUG struct tm lt; memset(<, 0, sizeof(lt)); -lt.tm_year = 2007 - 1900; // 2005 -lt.tm_mon = 11 - 1; // Nov +lt.tm_year = 2016 - 1900; // 2005 +lt.tm_mon = 7 - 1; // Nov lt.tm_hour = 23; // 23 h lt.tm_min = 57; // 50 min lt.tm_sec = 0; // 00 sec +lt.tm_isdst = -1; switch (START_TIME) { @@ -57,7 +68,7 @@ switch (START_TIME) break; case 2: - lt.tm_mday = 30; + lt.tm_mday = 31; stgTime = mktime(<); break; } @@ -69,12 +80,21 @@ 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 = {0, 1000000000 / TIME_SPEED}; + struct timespec ts; + if (TIME_SPEED == 1) + { + ts.tv_sec = 1; + ts.tv_nsec = 0; + } + else + { + ts.tv_sec = 0; + ts.tv_nsec = 1000000000 / TIME_SPEED; + } nanosleep(&ts, NULL); stgTime++; #else @@ -84,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"); } //-----------------------------------------------------------------------------