ReXGlue SDK
Loading...
Searching...
No Matches
timer.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <atomic>
17#include <chrono>
18#include <cstdint>
19#include <functional>
20#include <memory>
21#include <utility>
22
23#include <rex/assert.h>
24#include <rex/chrono.h>
25#include <rex/platform.h>
26#include <rex/platform/sync.h>
27#include <rex/types.h>
28
29namespace rex::platform {
30
31class TimerQueue;
32
35 using clock = std::chrono::steady_clock;
36
44 TimerQueueWaitItem(std::function<void(void*)> callback, void* userdata, TimerQueue* parent_queue,
45 clock::time_point due, clock::duration interval)
46 : callback_(std::move(callback)),
47 userdata_(userdata),
48 parent_queue_(parent_queue),
49 due_(due),
50 interval_(interval),
51 state_(State::kIdle) {}
52
57 void Disarm();
58
59 friend TimerQueue;
60
61 private:
62 enum class State : uint_least8_t { kIdle = 0, kInCallback, kInCallbackSelfDisarmed, kDisarmed };
63 static_assert(std::atomic<State>::is_always_lock_free);
64
65 std::function<void(void*)> callback_;
66 void* userdata_;
67 TimerQueue* parent_queue_;
68 clock::time_point due_;
69 clock::duration interval_;
70 std::atomic<State> state_;
71};
72
79REX_API std::weak_ptr<TimerQueueWaitItem> QueueTimerOnce(std::function<void(void*)> callback,
80 void* userdata,
81 TimerQueueWaitItem::clock::time_point due);
82
90REX_API std::weak_ptr<TimerQueueWaitItem> QueueTimerRecurring(
91 std::function<void(void*)> callback, void* userdata, TimerQueueWaitItem::clock::time_point due,
92 TimerQueueWaitItem::clock::duration interval);
93
95class HighResolutionTimer {
96 struct Key {};
97
98 public:
99 HighResolutionTimer(Key, std::chrono::milliseconds interval, std::function<void()> callback) {
100 REX_ASSERT(callback != nullptr);
101 wait_item_ = QueueTimerRecurring([callback = std::move(callback)](void*) { callback(); },
102 nullptr, TimerQueueWaitItem::clock::now(), interval);
103 }
104
105 ~HighResolutionTimer() {
106 if (auto wait_item = wait_item_.lock()) {
107 wait_item->Disarm();
108 }
109 }
110
111 static std::unique_ptr<HighResolutionTimer> CreateRepeating(std::chrono::milliseconds period,
112 std::function<void()> callback) {
113 return std::make_unique<HighResolutionTimer>(Key{}, period, std::move(callback));
114 }
115
116 private:
117 std::weak_ptr<TimerQueueWaitItem> wait_item_;
118};
119
124class REX_API Timer : public WaitHandle {
125 public:
126 using WindowsClock = rex::WinSystemClock;
127 using SteadyClock = std::chrono::steady_clock;
128
134 static std::unique_ptr<Timer> CreateManualResetTimer();
135
141 static std::unique_ptr<Timer> CreateSynchronizationTimer();
142
149 std::function<void()> opt_callback = nullptr) = 0;
155 virtual bool SetOnceAt(WindowsClock::time_point due_time,
156 std::function<void()> opt_callback = nullptr) = 0;
162 virtual bool SetOnceAt(SteadyClock::time_point due_time,
163 std::function<void()> opt_callback = nullptr) = 0;
164
170 virtual bool SetRepeatingAfter(rex::HundredNanoseconds rel_time, std::chrono::milliseconds period,
171 std::function<void()> opt_callback = nullptr) = 0;
177 virtual bool SetRepeatingAt(WindowsClock::time_point due_time, std::chrono::milliseconds period,
178 std::function<void()> opt_callback = nullptr) = 0;
184 virtual bool SetRepeatingAt(SteadyClock::time_point due_time, std::chrono::milliseconds period,
185 std::function<void()> opt_callback = nullptr) = 0;
186
191 virtual bool Cancel() = 0;
192
194 virtual bool Reset() = 0;
195};
196
197namespace detail {
198
200REX_API void ShutdownTimerQueue();
201
202} // namespace detail
203
204} // namespace rex::platform
#define REX_ASSERT(cond,...)
Definition assert.h:84
Host and guest clocks over NT time.
Definition timer.h:124
virtual bool SetRepeatingAfter(rex::HundredNanoseconds rel_time, std::chrono::milliseconds period, std::function< void()> opt_callback=nullptr)=0
virtual bool SetRepeatingAt(WindowsClock::time_point due_time, std::chrono::milliseconds period, std::function< void()> opt_callback=nullptr)=0
static std::unique_ptr< Timer > CreateSynchronizationTimer()
virtual bool Reset()=0
virtual bool SetRepeatingAt(SteadyClock::time_point due_time, std::chrono::milliseconds period, std::function< void()> opt_callback=nullptr)=0
virtual bool SetOnceAfter(rex::HundredNanoseconds rel_time, std::function< void()> opt_callback=nullptr)=0
virtual bool SetOnceAt(WindowsClock::time_point due_time, std::function< void()> opt_callback=nullptr)=0
virtual bool SetOnceAt(SteadyClock::time_point due_time, std::function< void()> opt_callback=nullptr)=0
virtual bool Cancel()=0
static std::unique_ptr< Timer > CreateManualResetTimer()
Definition platform.h:345
std::weak_ptr< TimerQueueWaitItem > QueueTimerRecurring(std::function< void(void *)> callback, void *userdata, TimerQueueWaitItem::clock::time_point due, TimerQueueWaitItem::clock::duration interval)
std::weak_ptr< TimerQueueWaitItem > QueueTimerOnce(std::function< void(void *)> callback, void *userdata, TimerQueueWaitItem::clock::time_point due)
detail::NtSystemClock< detail::Domain::kHost > WinSystemClock
Definition chrono.h:214
std::chrono::duration< i64, HundredNano > HundredNanoseconds
Definition chrono.h:138
Platform flags, packing macros and export markers.
#define REX_API
Definition platform.h:177
TimerQueueWaitItem(std::function< void(void *)> callback, void *userdata, TimerQueue *parent_queue, clock::time_point due, clock::duration interval)
Definition timer.h:44
Wait objects and wait functions.
Integer types, byte order wrappers and size literals.