12 #ifndef INCLUDE_DISTORTOS_INTERNAL_SCHEDULER_DYNAMICTHREADBASE_HPP_ 13 #define INCLUDE_DISTORTOS_INTERNAL_SCHEDULER_DYNAMICTHREADBASE_HPP_ 27 #if DISTORTOS_THREAD_DETACH_ENABLE == 1 31 #endif // DISTORTOS_THREAD_DETACH_ENABLE == 1 49 #if DISTORTOS_THREAD_DETACH_ENABLE == 1 71 template<
typename Function,
typename... Args>
72 DynamicThreadBase(
size_t stackSize,
bool canReceiveSignals,
size_t queuedSignals,
size_t signalActions,
76 #else // DISTORTOS_THREAD_DETACH_ENABLE != 1 97 template<
typename Function,
typename... Args>
98 DynamicThreadBase(
size_t stackSize,
bool canReceiveSignals,
size_t queuedSignals,
size_t signalActions,
99 uint8_t priority,
SchedulingPolicy schedulingPolicy, Function&&
function, Args&&... args);
112 template<
typename Function,
typename... Args>
116 std::forward<Function>(
function), std::forward<Args>(args)...}
121 #endif // DISTORTOS_THREAD_DETACH_ENABLE != 1 123 #if DISTORTOS_THREAD_DETACH_ENABLE == 1 140 #endif // DISTORTOS_THREAD_DETACH_ENABLE == 1 163 #if DISTORTOS_THREAD_DETACH_ENABLE == 1 185 #endif // DISTORTOS_THREAD_DETACH_ENABLE == 1 209 static_assert(
alignof(max_align_t) >= DISTORTOS_ARCHITECTURE_STACK_ALIGNMENT,
210 "Alignment of dynamically allocated memory is too low!");
212 const auto adjustedStackSize = (stackSize + DISTORTOS_ARCHITECTURE_STACK_ALIGNMENT - 1) /
213 DISTORTOS_ARCHITECTURE_STACK_ALIGNMENT * DISTORTOS_ARCHITECTURE_STACK_ALIGNMENT;
214 return {{
new uint8_t[adjustedStackSize +
stackGuardSize], storageDeleter<uint8_t>},
218 #if DISTORTOS_SIGNALS_ENABLE == 1 223 #endif // DISTORTOS_SIGNALS_ENABLE == 1 228 #if DISTORTOS_THREAD_DETACH_ENABLE == 1 233 #endif // DISTORTOS_THREAD_DETACH_ENABLE == 1 236 #if DISTORTOS_SIGNALS_ENABLE == 1 && DISTORTOS_THREAD_DETACH_ENABLE == 1 238 template<
typename Function,
typename... Args>
240 const size_t signalActions,
const uint8_t priority,
const SchedulingPolicy schedulingPolicy,
244 dynamicSignalsReceiver_{canReceiveSignals ==
true ? queuedSignals : 0,
245 canReceiveSignals ==
true ? signalActions : 0},
246 boundFunction_{std::bind(std::forward<Function>(
function), std::forward<Args>(args)...)},
252 #elif DISTORTOS_SIGNALS_ENABLE == 1 && DISTORTOS_THREAD_DETACH_ENABLE != 1 254 template<
typename Function,
typename... Args>
256 const size_t signalActions,
const uint8_t priority,
const SchedulingPolicy schedulingPolicy,
257 Function&&
function, Args&&... args) :
258 ThreadCommon{
makeStack(stackSize), priority, schedulingPolicy,
nullptr,
260 dynamicSignalsReceiver_{canReceiveSignals ==
true ? queuedSignals : 0,
261 canReceiveSignals ==
true ? signalActions : 0},
262 boundFunction_{std::bind(std::forward<Function>(
function), std::forward<Args>(args)...)}
267 #elif DISTORTOS_SIGNALS_ENABLE != 1 && DISTORTOS_THREAD_DETACH_ENABLE == 1 269 template<
typename Function,
typename... Args>
271 const SchedulingPolicy schedulingPolicy, DynamicThread& owner, Function&&
function, Args&&... args) :
272 ThreadCommon{
makeStack(stackSize), priority, schedulingPolicy,
nullptr,
nullptr},
273 boundFunction_{std::bind(std::forward<Function>(
function), std::forward<Args>(args)...)},
279 #else // DISTORTOS_SIGNALS_ENABLE != 1 && DISTORTOS_THREAD_DETACH_ENABLE != 1 281 template<
typename Function,
typename... Args>
283 const SchedulingPolicy schedulingPolicy, Function&&
function, Args&&... args) :
284 ThreadCommon{
makeStack(stackSize), priority, schedulingPolicy,
nullptr,
nullptr},
285 boundFunction_{std::bind(std::forward<Function>(
function), std::forward<Args>(args)...)}
290 #endif // DISTORTOS_SIGNALS_ENABLE != 1 && DISTORTOS_THREAD_DETACH_ENABLE != 1 296 #endif // INCLUDE_DISTORTOS_INTERNAL_SCHEDULER_DYNAMICTHREADBASE_HPP_ DynamicSignalsReceiver class header.
size_t queuedSignals
Definition: DynamicThreadParameters.hpp:78
int start()
Starts the thread.
Definition: DynamicThreadBase.hpp:151
DynamicThreadBase class is a type-erased interface for thread that has dynamic storage for bound func...
Definition: DynamicThreadBase.hpp:45
DynamicThreadParameters class header.
void run() override
Thread's "run" function.
Definition: DynamicThreadBase.cpp:78
SchedulingPolicy schedulingPolicy
scheduling policy of the thread
Definition: DynamicThreadParameters.hpp:94
size_t stackSize
size of stack, bytes
Definition: DynamicThreadParameters.hpp:85
SchedulingPolicy
scheduling policy of the thread
Definition: SchedulingPolicy.hpp:26
static Stack makeStack(const size_t stackSize)
Helper function to make stack with size adjusted to alignment requirements.
Definition: DynamicThreadBase.hpp:207
void exit1Hook() override
Thread's "exit 1" hook function.
Definition: DynamicThreadBase.cpp:68
uint8_t priority
thread's priority, 0 - lowest, UINT8_MAX - highest
Definition: DynamicThreadParameters.hpp:91
DynamicThreadBase(size_t stackSize, bool canReceiveSignals, size_t queuedSignals, size_t signalActions, uint8_t priority, SchedulingPolicy schedulingPolicy, DynamicThread &owner, Function &&function, Args &&... args)
DynamicThreadBase's constructor.
Definition: DynamicThreadBase.hpp:239
bool canReceiveSignals
selects whether reception of signals is enabled (true) or disabled (false) for this thread
Definition: DynamicThreadParameters.hpp:88
DynamicSignalsReceiver class is a templated interface for SignalsReceiver that has dynamic storage fo...
Definition: DynamicSignalsReceiver.hpp:31
void exit0Hook() override
Thread's "exit 0" hook function.
Definition: DynamicThreadBase.cpp:60
storageDeleter() definition
DynamicSignalsReceiver dynamicSignalsReceiver_
internal DynamicSignalsReceiver object
Definition: DynamicThreadBase.hpp:221
Top-level namespace of distortos project.
Definition: buttons.hpp:33
DynamicThreadParameters struct is a helper with parameters for DynamicThread's constructor.
Definition: DynamicThreadParameters.hpp:32
Stack class is an abstraction of architecture's stack.
Definition: Stack.hpp:32
ThreadCommon class header.
constexpr size_t stackGuardSize
size of "stack guard", bytes
Definition: stackGuardSize.hpp:26
int startInternal()
Starts the thread.
Definition: ThreadCommon.cpp:164
size_t signalActions
Definition: DynamicThreadParameters.hpp:82
std::function< void()> boundFunction_
bound function object
Definition: DynamicThreadBase.hpp:226
int detach() override
Detaches the thread.
Definition: DynamicThreadBase.cpp:38
DynamicThread * owner_
pointer to owner DynamicThread object, nullptr if thread is detached
Definition: DynamicThreadBase.hpp:231
DynamicThread class is a type-erased interface for thread that has dynamic storage for bound function...
Definition: DynamicThread.hpp:32
ThreadCommon class implements common functionality of threads.
Definition: ThreadCommon.hpp:27