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

Method run_

test/Signals/SignalsCatchingTestCase.cpp:1606–1674  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1604+---------------------------------------------------------------------------------------------------------------------*/
1605
1606bool SignalsCatchingTestCase::run_() const
1607{
1608#if SIGNALS_CATCHING_TEST_CASE_ENABLED == 1
1609
1610 const auto contextSwitchCount = statistics::getContextSwitchCount();
1611 auto expectedContextSwitchCount = decltype(contextSwitchCount){};
1612
1613 for (uint8_t signalNumber {}; signalNumber < totalSignals; ++signalNumber)
1614 {
1615 const auto setSignalActionResult = ThisThread::Signals::setSignalAction(signalNumber,
1616 {handler, getSignalMask(totalSignals + signalNumber)});
1617 if (setSignalActionResult.first != 0)
1618 return false;
1619 }
1620
1621 auto& currentThread = ThisThread::get();
1622
1623 for (auto& stage : stages)
1624 {
1625 // initially no signals may be pending
1626 if (ThisThread::Signals::getPendingSignalSet().getBitset().any() == true)
1627 return false;
1628
1629 sharedSequenceAsserter = {}; // reset object
1630 sharedSigAtomic = {}; // reset object
1631
1632 handlerStepsRange = stage.signalHandlerStepsRange;
1633 auto currentThreadStepsRange = stage.mainTestThreadStepsRange;
1634 auto secondTestThreadStepsRange = stage.secondTestThreadStepsRange;
1635
1636 auto secondThread = makeDynamicThread({secondTestThreadStackSize, secondTestThreadPriority}, testStepsRunner,
1637 std::ref(secondTestThreadStepsRange), std::ref(currentThread), nullptr);
1638
1639 const auto isSecondThreadNeeded = secondTestThreadStepsRange.size() != 0;
1640 if (isSecondThreadNeeded == true)
1641 secondThread.start();
1642
1643 testStepsRunner(currentThreadStepsRange, currentThread, nullptr);
1644
1645 if (isSecondThreadNeeded == true)
1646 secondThread.join();
1647
1648 const auto mainTestThreadStepsRangeSize = stage.mainTestThreadStepsRange.size();
1649 const auto signalHandlerStepsRangeSize = stage.signalHandlerStepsRange.size();
1650 const auto secondTestThreadStepsRangeSize = stage.secondTestThreadStepsRange.size();
1651 const auto totalTestStepsRangeSize = mainTestThreadStepsRangeSize + signalHandlerStepsRangeSize +
1652 secondTestThreadStepsRangeSize;
1653 if (sharedSequenceAsserter.assertSequence(2 * totalTestStepsRangeSize) == false)
1654 return false;
1655
1656 if (sharedSigAtomic != 0)
1657 return false;
1658
1659 expectedContextSwitchCount += stage.contextSwitchCount;
1660 if (statistics::getContextSwitchCount() - contextSwitchCount != expectedContextSwitchCount)
1661 return false;
1662 }
1663

Callers

nothing calls this directly

Calls 11

getContextSwitchCountFunction · 0.85
setSignalActionFunction · 0.85
getPendingSignalSetFunction · 0.85
makeDynamicThreadFunction · 0.85
testStepsRunnerFunction · 0.85
getBitsetMethod · 0.80
assertSequenceMethod · 0.80
getSignalMaskFunction · 0.70
sizeMethod · 0.45
startMethod · 0.45
joinMethod · 0.45

Tested by

no test coverage detected