| 97 | +---------------------------------------------------------------------------------------------------------------------*/ |
| 98 | |
| 99 | bool 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; |
nothing calls this directly
no test coverage detected