MCPcopy Create free account
hub / github.com/DISTORTEC/distortos / run_

Method run_

test/Thread/ThreadSchedulingPolicyTestCase.cpp:99–164  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

97+---------------------------------------------------------------------------------------------------------------------*/
98
99bool ThreadSchedulingPolicyTestCase::run_() const
100{
101 const auto allocatedMemory = mallinfo().uordblks;
102
103 // scheduling policy, sequence point multiplier, sequence point step
104 using Parameters = std::tuple<SchedulingPolicy, unsigned int, unsigned int>;
105 static const Parameters parametersArray[]
106 {
107 Parameters{SchedulingPolicy::fifo, 2, 1},
108 Parameters{SchedulingPolicy::roundRobin, 1, totalThreads},
109 };
110
111 for (const auto& parameters : parametersArray)
112 {
113 {
114 const auto schedulingPolicy = std::get<0>(parameters);
115 const auto multiplier = std::get<1>(parameters);
116 const auto step = std::get<2>(parameters);
117
118 SequenceAsserter sequenceAsserter;
119
120 std::array<DynamicThread, totalThreads> threads
121 {{
122 makeTestThread(schedulingPolicy, sequenceAsserter, {0 * multiplier, 0 * multiplier + step}),
123 makeTestThread(schedulingPolicy, sequenceAsserter, {1 * multiplier, 1 * multiplier + step}),
124 makeTestThread(schedulingPolicy, sequenceAsserter, {2 * multiplier, 2 * multiplier + step}),
125 makeTestThread(schedulingPolicy, sequenceAsserter, {3 * multiplier, 3 * multiplier + step}),
126 makeTestThread(schedulingPolicy, sequenceAsserter, {4 * multiplier, 4 * multiplier + step}),
127 makeTestThread(schedulingPolicy, sequenceAsserter, {5 * multiplier, 5 * multiplier + step}),
128 makeTestThread(schedulingPolicy, sequenceAsserter, {6 * multiplier, 6 * multiplier + step}),
129 makeTestThread(schedulingPolicy, sequenceAsserter, {7 * multiplier, 7 * multiplier + step}),
130 }};
131
132 decltype(TickClock::now()) testStart;
133
134 {
135 const InterruptMaskingLock interruptMaskingLock;
136
137 // wait for beginning of next tick - test threads should be started in the same tick
138 ThisThread::sleepFor({});
139
140 for (auto& thread : threads)
141 thread.start();
142
143 testStart = TickClock::now();
144 }
145
146 for (auto& thread : threads)
147 thread.join();
148
149 const auto testDuration = TickClock::now() - testStart;
150
151 if (sequenceAsserter.assertSequence(totalThreads * 2) == false)
152 return false;
153
154 // exact time cannot be calculated, because wasteTime() is not precise when context switches occur during it
155 if (testDuration < testThreadDuration * totalThreads)
156 return false;

Callers

nothing calls this directly

Calls 5

assertSequenceMethod · 0.80
makeTestThreadFunction · 0.70
sleepForFunction · 0.50
startMethod · 0.45
joinMethod · 0.45

Tested by

no test coverage detected