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

Function waitImplementation

source/synchronization/ThisThread-Signals.cpp:94–138  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

92 */
93
94std::pair<int, SignalInformation> waitImplementation(const SignalSet& signalSet, const bool nonBlocking,
95 const TickClock::time_point* const timePoint)
96{
97 CHECK_FUNCTION_CONTEXT();
98
99 auto& scheduler = internal::getScheduler();
100 const auto signalsReceiverControlBlock = scheduler.getCurrentThreadControlBlock().getSignalsReceiverControlBlock();
101 if (signalsReceiverControlBlock == nullptr)
102 return {ENOTSUP, SignalInformation{uint8_t{}, SignalInformation::Code{}, sigval{}}};
103
104 const InterruptMaskingLock interruptMaskingLock;
105
106 const auto bitset = signalSet.getBitset();
107 auto pendingSignalSet = signalsReceiverControlBlock->getPendingSignalSet();
108 auto pendingBitset = pendingSignalSet.getBitset();
109 auto intersection = bitset & pendingBitset;
110
111 if (intersection.none() == true) // none of desired signals is pending, so current thread must be blocked
112 {
113 if (nonBlocking == true)
114 return {EAGAIN, SignalInformation{uint8_t{}, SignalInformation::Code{}, sigval{}}};
115
116 internal::ThreadList waitingList;
117
118 signalsReceiverControlBlock->setWaitingSignalSet(&signalSet);
119 const SignalsWaitUnblockFunctor signalsWaitUnblockFunctor;
120 const auto ret = timePoint == nullptr ?
121 scheduler.block(waitingList, ThreadState::waitingForSignal, &signalsWaitUnblockFunctor) :
122 scheduler.blockUntil(waitingList, ThreadState::waitingForSignal, *timePoint,
123 &signalsWaitUnblockFunctor);
124 if (ret != 0)
125 return {ret, SignalInformation{uint8_t{}, SignalInformation::Code{}, sigval{}}};
126
127 pendingSignalSet = signalsReceiverControlBlock->getPendingSignalSet();
128 pendingBitset = pendingSignalSet.getBitset();
129 intersection = bitset & pendingBitset;
130 }
131
132 const auto intersectionValue = intersection.to_ulong();
133 static_assert(sizeof(intersectionValue) == intersection.size() / 8,
134 "Size of intersectionValue doesn't match size of intersection!");
135 // GCC builtin - "find first set" - https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
136 const auto signalNumber = __builtin_ffsl(intersectionValue) - 1;
137 return signalsReceiverControlBlock->acceptPendingSignal(signalNumber);
138}
139
140} // namespace
141

Callers 3

tryWaitFunction · 0.85
tryWaitUntilFunction · 0.85
waitFunction · 0.85

Calls 9

getBitsetMethod · 0.80
noneMethod · 0.80
setWaitingSignalSetMethod · 0.80
blockUntilMethod · 0.80
acceptPendingSignalMethod · 0.80
getPendingSignalSetMethod · 0.45
blockMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected