-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscheduler.cc
88 lines (76 loc) · 2.14 KB
/
scheduler.cc
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <cmath>
#include "scheduler.h"
#include "job.h"
using std::fmod;
double gcd(double a, double b)
{
while (b) {
double t = b;
b = fmod(a, b);
a = t;
}
return a;
}
double lcm(double a, double b)
{
return (a*b) / gcd(a,b);
}
double hyperperiod(std::vector<Task*> const & tasks)
{
double h = 1;
for (auto t: tasks) {
h = lcm(h, t->period);
}
return h;
}
int JobCmp::operator () (Job *j1, Job *j2)
{
return sched->prioLessThanEq(j1, j2, crit);
}
Scheduler::Scheduler(std::vector<Task*> const & t) : tasks(t)
{
hp = hyperperiod(tasks);
for (auto& t: tasks) {
for (int i = 0; i < hp/t->period; ++i) {
jobs.push_back(t->getJob(i));
}
}
}
Scheduler::~Scheduler()
{}
Scheduler *Scheduler::create(char c, std::vector<Task*> const & t)
{
static Scheduler *sched = nullptr;
assert(!sched);
switch(c) {
case 'd':
printf("Using rate-monotonic scheduler.\n");
return sched = new DefaultScheduler(t);
case 'e':
printf("Using edf scheduler.\n");
return sched = new EDFScheduler(t);
default:
printf("Unknown Scheduler-character: %c", c);
assert(false);
}
}
int DefaultScheduler::prioLessThanEq(Job const *j1, Job const *j2, int)
{
return j1->crit() < j2->crit() ||
(j1->crit() == j2->crit()
&& (j1->period() > j2->period() ||
(j1->period() == j2->period() &&
j1->taskName() <= j2->taskName())));
}
int EDFScheduler::prioLessThanEq(Job const *j1, Job const *j2, int crit)
{
if ((j1->crit() >= crit) == (j2->crit() >= crit)) {
return j1->deadline() > j2->deadline() ||
(j1->deadline() == j2->deadline() &&
j1->taskName() <= j2->taskName());
} else if (j1->crit() >= crit) {
return false;
} else {
return true;
}
}