summaryrefslogtreecommitdiff
path: root/src/managers/eventLoop/EventLoopTimer.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-04-07 03:31:51 +0100
committerGitHub <noreply@github.com>2024-04-07 03:31:51 +0100
commitf2a848cbcc41f29fb62ee67aef95136ae1a650da (patch)
tree6af50d58aa94fbb48880694a76f6edb79fa370ed /src/managers/eventLoop/EventLoopTimer.cpp
parent9f1604e4b0afec40cfa9bc095d6613a7f749b2c1 (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.cpp53
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();
+}