-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscheduler.cpp
45 lines (37 loc) · 1.14 KB
/
scheduler.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/* Problem: How to achieve concurrency without threads?
Figure out : how to switch tasks
*/
#include "scheduler.hpp"
using Task = std::function<void()>;
ScheduledTask::ScheduledTask(
Task task,
std::chrono::time_point<std::chrono::high_resolution_clock> runAt) {
this->task = task;
this->runAt = runAt;
}
void Scheduler::callSoon(Task func) { ready.push(func); };
void Scheduler::callLater(const Task &func, int delay) {
auto executionTime =
std::chrono::high_resolution_clock::now() + std::chrono::seconds(delay);
sleeping.push(ScheduledTask(func, executionTime));
};
void Scheduler::run() {
while (!ready.empty() || !sleeping.empty()) {
if (ready.empty()) {
auto aScheduledTask = sleeping.top();
auto func = aScheduledTask.task;
auto executionTime = aScheduledTask.runAt;
auto delta = executionTime - std::chrono::high_resolution_clock::now();
if (delta > std::chrono::seconds(0)) {
std::this_thread::sleep_for(delta);
}
ready.push(func);
sleeping.pop();
}
while (!ready.empty()) {
auto func = ready.front();
func();
ready.pop();
}
}
};