Zappy Server
C++ game server: world, rules, scheduler, network
Loading...
Searching...
No Matches
Scheduler.cpp
Go to the documentation of this file.
1#include "Scheduler.hpp"
2
3void Scheduler::schedule(std::chrono::milliseconds delay, std::function<void()> cb)
4{
5 _queue.push({std::chrono::steady_clock::now() + delay, std::move(cb)});
6}
7
9{
10 auto now = std::chrono::steady_clock::now();
11 while (!_queue.empty() && _queue.top().fireAt <= now) {
12 auto cb = std::move(_queue.top().callback);
13 _queue.pop();
14 cb();
15 }
16}
17
19{
20 if (_queue.empty()) return -1;
21
22 auto now = std::chrono::steady_clock::now();
23 auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(_queue.top().fireAt - now);
24 return diff.count() < 0 ? 0 : static_cast<int>(diff.count());
25}
26
28{
29 while (!_queue.empty()) _queue.pop();
30}
31
32void Scheduler::rescale(float ratio)
33{
34 auto now = std::chrono::steady_clock::now();
35 std::vector<TimedEvent> events;
36 while (!_queue.empty()) {
37 events.push_back(_queue.top());
38 _queue.pop();
39 }
40 for (auto& e : events) {
41 auto remaining = e.fireAt - now;
42 auto scaled = std::chrono::duration_cast<std::chrono::nanoseconds>(remaining * ratio);
43 e.fireAt = now + scaled;
44 _queue.push(std::move(e));
45 }
46}
void schedule(std::chrono::milliseconds delay, std::function< void()> cb)
Definition Scheduler.cpp:3
void clear()
Drop all pending events (e.g. on game end, to freeze the world instantly).
Definition Scheduler.cpp:27
std::priority_queue< TimedEvent, std::vector< TimedEvent >, std::greater< TimedEvent > > _queue
Definition Scheduler.hpp:46
int msUntilNext() const
Milliseconds until the next event. Pass directly to poll() as timeout. Returns -1 if the queue is emp...
Definition Scheduler.cpp:18
void rescale(float ratio)
Rescale all pending fire times by ratio.
Definition Scheduler.cpp:32
void tick()
Definition Scheduler.cpp:8