diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2024-04-07 03:31:51 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-07 03:31:51 +0100 |
| commit | f2a848cbcc41f29fb62ee67aef95136ae1a650da (patch) | |
| tree | 6af50d58aa94fbb48880694a76f6edb79fa370ed /src/managers/eventLoop/EventLoopTimer.cpp | |
| parent | 9f1604e4b0afec40cfa9bc095d6613a7f749b2c1 (diff) | |
core: Event loop rework (#5466)
* Event loop rework
* revert missed
Diffstat (limited to 'src/managers/eventLoop/EventLoopTimer.cpp')
| -rw-r--r-- | src/managers/eventLoop/EventLoopTimer.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/managers/eventLoop/EventLoopTimer.cpp b/src/managers/eventLoop/EventLoopTimer.cpp new file mode 100644 index 00000000..ebfb696c --- /dev/null +++ b/src/managers/eventLoop/EventLoopTimer.cpp @@ -0,0 +1,53 @@ +#include "EventLoopTimer.hpp" +#include <numeric> +#include "EventLoopManager.hpp" + +CEventLoopTimer::CEventLoopTimer(std::optional<std::chrono::system_clock::duration> timeout, std::function<void(std::shared_ptr<CEventLoopTimer> self, void* data)> cb_, + void* data_) : + cb(cb_), + data(data_) { + + if (!timeout.has_value()) + expires.reset(); + else + expires = std::chrono::system_clock::now() + *timeout; +} + +void CEventLoopTimer::updateTimeout(std::optional<std::chrono::system_clock::duration> timeout) { + if (!timeout.has_value()) { + expires.reset(); + g_pEventLoopManager->nudgeTimers(); + return; + } + + expires = std::chrono::system_clock::now() + *timeout; + + g_pEventLoopManager->nudgeTimers(); +} + +bool CEventLoopTimer::passed() { + if (!expires.has_value()) + return false; + return std::chrono::system_clock::now() > *expires; +} + +void CEventLoopTimer::cancel() { + wasCancelled = true; + expires.reset(); +} + +bool CEventLoopTimer::cancelled() { + return wasCancelled; +} + +void CEventLoopTimer::call(std::shared_ptr<CEventLoopTimer> self) { + expires.reset(); + cb(self, data); +} + +float CEventLoopTimer::leftUs() { + if (!expires.has_value()) + return std::numeric_limits<float>::max(); + + return std::chrono::duration_cast<std::chrono::microseconds>(*expires - std::chrono::system_clock::now()).count(); +} |
