35 using clock = std::chrono::steady_clock;
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)),
48 parent_queue_(parent_queue),
51 state_(State::kIdle) {}
62 enum class State : uint_least8_t { kIdle = 0, kInCallback, kInCallbackSelfDisarmed, kDisarmed };
63 static_assert(std::atomic<State>::is_always_lock_free);
65 std::function<void(
void*)> callback_;
67 TimerQueue* parent_queue_;
68 clock::time_point due_;
69 clock::duration interval_;
70 std::atomic<State> state_;
81 TimerQueueWaitItem::clock::time_point due);
91 std::function<
void(
void*)> callback,
void* userdata, TimerQueueWaitItem::clock::time_point due,
92 TimerQueueWaitItem::clock::duration interval);
95class HighResolutionTimer {
99 HighResolutionTimer(Key, std::chrono::milliseconds interval, std::function<
void()> callback) {
102 nullptr, TimerQueueWaitItem::clock::now(), interval);
105 ~HighResolutionTimer() {
106 if (
auto wait_item = wait_item_.lock()) {
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));
117 std::weak_ptr<TimerQueueWaitItem> wait_item_;
127 using SteadyClock = std::chrono::steady_clock;
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;
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;
200REX_API void ShutdownTimerQueue();
#define REX_ASSERT(cond,...)
Definition assert.h:84
Host and guest clocks over NT time.
detail::NtSystemClock< detail::Domain::kHost > WinSystemClock
Definition chrono.h:214
std::chrono::duration< i64, HundredNano > HundredNanoseconds
Definition chrono.h:138
Wait objects and wait functions.
Integer types, byte order wrappers and size literals.