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
|
#include <chrono>
#include <gtest/gtest.h>
#include <iomanip>
#include <iostream>
#include <valgrind/valgrind.h>
#include "../sched/roundrobin.cpp"
void
run(Task *task, int slice)
{
std::cout << "Running task " << task->name << " id=" << std::setw(2) << task->id << " prio=" << std::setw(2)
<< task->priority << " burst=" << std::setw(2) << task->burst << " slice=" << slice << " ";
}
struct DebugRoundRobinQueue : public RoundRobinQueue {
public:
void
print() const
{
for (auto *it = head; it != nullptr; it = it->next) {
std::cout << it->node->name << '(' << std::setw(2) << it->node->burst << ") ";
}
std::cout << std::endl;
}
};
TEST(roundrobin, RoundRobinQueue)
{
DebugRoundRobinQueue queue;
queue.insert(new Task{"P1", 1, 1, 50});
queue.insert(new Task{"P2", 2, 1, 40});
queue.insert(new Task{"P3", 3, 1, 50});
queue.insert(new Task{"P4", 4, 1, 40});
const auto begin = std::chrono::system_clock::now();
for (auto *t = queue.next(10); t != nullptr; t = queue.next(10)) {
run(t, 10);
queue.print();
}
const auto end = std::chrono::system_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count();
std::cout << "Completed in (us): " << duration << std::endl;
// test should complete in 250us unless running on valgrind
if (!RUNNING_ON_VALGRIND) EXPECT_LE(duration, 250);
EXPECT_EQ(queue.head, nullptr);
EXPECT_EQ(queue.tail, nullptr);
}
|