Commit e1c7b86f781635e35a00bde4f49cbd5176d242b7
1 parent
fc2ba5b6
Use monotonic clock in Timer class
This fixes side effects when system time changes.
Showing
4 changed files
with
4 additions
and
16 deletions
timer.cpp
| @@ -24,16 +24,13 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | @@ -24,16 +24,13 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | ||
| 24 | 24 | ||
| 25 | void CallbackEntry::updateExectedAt() | 25 | void CallbackEntry::updateExectedAt() |
| 26 | { | 26 | { |
| 27 | - this->lastExecuted = currentMSecsSinceEpoch(); | 27 | + this->lastExecuted = std::chrono::steady_clock::now(); |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | uint64_t CallbackEntry::getNextCallMs() const | 30 | uint64_t CallbackEntry::getNextCallMs() const |
| 31 | { | 31 | { |
| 32 | - int64_t elapsedSinceLastCall = currentMSecsSinceEpoch() - lastExecuted; | ||
| 33 | - if (elapsedSinceLastCall < 0) // Correct for clock drift | ||
| 34 | - elapsedSinceLastCall = 0; | ||
| 35 | - | ||
| 36 | - int64_t newDelay = this->interval - elapsedSinceLastCall; | 32 | + const std::chrono::milliseconds elapsedSinceLastCall = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - lastExecuted); |
| 33 | + int64_t newDelay = this->interval - elapsedSinceLastCall.count(); | ||
| 37 | if (newDelay < 0) | 34 | if (newDelay < 0) |
| 38 | newDelay = 0; | 35 | newDelay = 0; |
| 39 | return newDelay; | 36 | return newDelay; |
timer.h
| @@ -29,7 +29,7 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | @@ -29,7 +29,7 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | ||
| 29 | 29 | ||
| 30 | struct CallbackEntry | 30 | struct CallbackEntry |
| 31 | { | 31 | { |
| 32 | - uint64_t lastExecuted = currentMSecsSinceEpoch(); // assume the first one executed to avoid instantly calling it. | 32 | + std::chrono::time_point<std::chrono::steady_clock> lastExecuted = std::chrono::steady_clock::now(); |
| 33 | uint64_t interval = 0; | 33 | uint64_t interval = 0; |
| 34 | std::function<void ()> f = nullptr; | 34 | std::function<void ()> f = nullptr; |
| 35 | std::string name; | 35 | std::string name; |
utils.cpp
| @@ -294,14 +294,6 @@ bool startsWith(const std::string &s, const std::string &needle) | @@ -294,14 +294,6 @@ bool startsWith(const std::string &s, const std::string &needle) | ||
| 294 | return s.find(needle) == 0; | 294 | return s.find(needle) == 0; |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | -int64_t currentMSecsSinceEpoch() | ||
| 298 | -{ | ||
| 299 | - struct timeval te; | ||
| 300 | - gettimeofday(&te, NULL); | ||
| 301 | - int64_t milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; | ||
| 302 | - return milliseconds; | ||
| 303 | -} | ||
| 304 | - | ||
| 305 | std::string getSecureRandomString(const ssize_t len) | 297 | std::string getSecureRandomString(const ssize_t len) |
| 306 | { | 298 | { |
| 307 | std::vector<unsigned char> buf(len); | 299 | std::vector<unsigned char> buf(len); |
utils.h
| @@ -65,7 +65,6 @@ void rtrim(std::string &s); | @@ -65,7 +65,6 @@ void rtrim(std::string &s); | ||
| 65 | void trim(std::string &s); | 65 | void trim(std::string &s); |
| 66 | bool startsWith(const std::string &s, const std::string &needle); | 66 | bool startsWith(const std::string &s, const std::string &needle); |
| 67 | 67 | ||
| 68 | -int64_t currentMSecsSinceEpoch(); | ||
| 69 | std::string getSecureRandomString(const ssize_t len); | 68 | std::string getSecureRandomString(const ssize_t len); |
| 70 | std::string str_tolower(std::string s); | 69 | std::string str_tolower(std::string s); |
| 71 | bool stringTruthiness(const std::string &val); | 70 | bool stringTruthiness(const std::string &val); |