50 using clock = std::chrono::steady_clock;
69 void schedule(std::function<
void()> fn)
override {
post(std::move(fn)); }
71 std::function<
void()> fn)
override {
77 void post(std::function<
void()> fn)
override {
84 std::lock_guard lk(m_);
85 queue_.push(Entry{now_ + delay, ++seq_, std::move(fn)});
90 std::lock_guard lk(m_);
95 [[nodiscard]] std::size_t
pending() const noexcept {
96 std::lock_guard lk(m_);
108 std::size_t fired = 0;
110 std::function<void()> fn;
112 std::lock_guard lk(m_);
113 if (queue_.empty() || queue_.top().deadline > target) {
117 auto e = queue_.top();
120 fn = std::move(e.fn);
127 std::string_view{
"executor.virtual_time.advance"},
128 std::current_exception());
139 std::size_t fired = 0;
141 std::function<void()> fn;
143 std::lock_guard lk(m_);
144 if (queue_.empty())
break;
145 auto e = queue_.top();
147 if (e.deadline > now_) now_ = e.deadline;
148 fn = std::move(e.fn);
154 std::string_view{
"executor.virtual_time.run_until_idle"},
155 std::current_exception());
164 std::priority_queue<Entry, std::vector<Entry>, Cmp> retired;
166 std::lock_guard lk(m_);
167 std::swap(queue_, retired);
176 std::function<void()> fn;
179 bool operator()(
const Entry& a,
const Entry& b)
const noexcept {
180 if (a.deadline != b.deadline)
return a.deadline > b.deadline;
181 return a.seq > b.seq;
185 mutable std::mutex m_;
187 std::uint64_t seq_{0};
188 std::priority_queue<Entry, std::vector<Entry>, Cmp> queue_;
199 bool await_ready()
const noexcept {
return false; }
200 void await_suspend(std::coroutine_handle<> h)
const {
201 vt.
post_after(delay, [h]()
mutable { h.resume(); });
203 void await_resume()
const noexcept {}
205 return Awaiter{vt, delay};
Tiny interface — anything that can post a function to run after a delay.
Definition property_ops.hpp:62
Abstract executor interface — schedules a callable to run "somewhere".
Definition executor.hpp:36
Definition virtual_time_executor.hpp:48
aria::SchedulerCaps caps() const noexcept override
Capabilities: Post (immediate), Delay (deadline-keyed), GraphSafe.
Definition virtual_time_executor.hpp:62
duration now() const noexcept
Current virtual time (since construction).
Definition virtual_time_executor.hpp:89
VirtualTimeExecutor()=default
std::chrono::milliseconds duration
Definition virtual_time_executor.hpp:51
std::size_t advance_to(duration target)
Advance to an absolute virtual time target (must be >= now()).
Definition virtual_time_executor.hpp:107
void post_after(duration delay, std::function< void()> fn) override
Schedule to run after delay of virtual time.
Definition virtual_time_executor.hpp:83
void schedule_after(std::chrono::milliseconds delay, std::function< void()> fn) override
Submit fn for execution after delay.
Definition virtual_time_executor.hpp:70
std::size_t advance_by(duration delta)
Advance virtual time by delta, firing tasks in deadline order.
Definition virtual_time_executor.hpp:102
std::size_t pending() const noexcept
Number of scheduled tasks not yet fired.
Definition virtual_time_executor.hpp:95
std::chrono::steady_clock clock
Definition virtual_time_executor.hpp:50
void clear() noexcept
Drop all scheduled tasks without firing them.
Definition virtual_time_executor.hpp:163
void post(std::function< void()> fn) override
IExecutor: schedule "now" — runs at the current virtual time when the next advance_by()/run_until_idl...
Definition virtual_time_executor.hpp:77
std::size_t run_until_idle()
Run everything currently queued without advancing time beyond the last deadline.
Definition virtual_time_executor.hpp:138
void schedule(std::function< void()> fn) override
Submit fn for execution "soon". Defines Caps::Post.
Definition virtual_time_executor.hpp:69
Definition async_command.hpp:118
auto schedule_after(VirtualTimeExecutor &vt, VirtualTimeExecutor::duration delay)
Awaiter that resumes the coroutine after delay of virtual time.
Definition virtual_time_executor.hpp:194
void report_callback_failure(std::string_view category, std::exception_ptr exception, std::string_view message={}) noexcept
Report a callback failure.
SchedulerCaps
Definition scheduler.hpp:83
@ Post
Can submit "fire now" work.
Definition scheduler.hpp:89
@ GraphSafe
Safe to use as the graph-thread executor — i.e.
Definition scheduler.hpp:107
@ Pumpable
Posted work is held in a queue until a pump-style call drains it (e.g.
Definition scheduler.hpp:102
@ Delay
Can submit work after a wall-clock or virtual-time delay.
Definition scheduler.hpp:93
@ WorkerSafe
Safe to host blocking worker tasks (e.g.
Definition scheduler.hpp:111