aboutsummaryrefslogtreecommitdiffstats
path: root/include/distortos/internal/scheduler/ThreadControlBlock.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/distortos/internal/scheduler/ThreadControlBlock.hpp')
-rw-r--r--include/distortos/internal/scheduler/ThreadControlBlock.hpp336
1 files changed, 0 insertions, 336 deletions
diff --git a/include/distortos/internal/scheduler/ThreadControlBlock.hpp b/include/distortos/internal/scheduler/ThreadControlBlock.hpp
deleted file mode 100644
index 6d6f458..0000000
--- a/include/distortos/internal/scheduler/ThreadControlBlock.hpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/**
- * \file
- * \brief ThreadControlBlock class header
- *
- * \author Copyright (C) 2014-2015 Kamil Szczygiel http://www.distortec.com http://www.freddiechopin.info
- *
- * \par License
- * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not
- * distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#ifndef INCLUDE_DISTORTOS_INTERNAL_SCHEDULER_THREADCONTROLBLOCK_HPP_
-#define INCLUDE_DISTORTOS_INTERNAL_SCHEDULER_THREADCONTROLBLOCK_HPP_
-
-#include "distortos/internal/scheduler/RoundRobinQuantum.hpp"
-#include "distortos/internal/scheduler/ThreadListNode.hpp"
-
-#include "distortos/internal/synchronization/MutexList.hpp"
-
-#include "distortos/architecture/Stack.hpp"
-
-#include "distortos/SchedulingPolicy.hpp"
-#include "distortos/ThreadState.hpp"
-
-#include "estd/TypeErasedFunctor.hpp"
-
-namespace distortos
-{
-
-class SignalsReceiver;
-
-namespace internal
-{
-
-class SignalsReceiverControlBlock;
-class ThreadList;
-class ThreadGroupControlBlock;
-
-/// ThreadControlBlock class is a simple description of a Thread
-class ThreadControlBlock : public ThreadListNode
-{
-public:
-
- /// reason of thread unblocking
- enum class UnblockReason : uint8_t
- {
- /// explicit request to unblock the thread - normal unblock
- unblockRequest,
- /// timeout - unblock via software timer
- timeout,
- /// signal handler - unblock to deliver unmasked signal
- signal,
- };
-
- /// UnblockFunctor is a functor executed when unblocking the thread, it receives two parameter - a reference to
- /// ThreadControlBlock that is being unblocked and the reason of thread unblocking
- class UnblockFunctor : public estd::TypeErasedFunctor<void(ThreadControlBlock&, UnblockReason)>
- {
-
- };
-
- /**
- * \brief ThreadControlBlock constructor.
- *
- * \param [in] stack is an rvalue reference to architecture::Stack object which will be adopted for this thread
- * \param [in] priority is the thread's priority, 0 - lowest, UINT8_MAX - highest
- * \param [in] schedulingPolicy is the scheduling policy of the thread
- * \param [in] threadGroupControlBlock is a pointer to ThreadGroupControlBlock to which this object will be added,
- * nullptr to inherit thread group from currently running thread
- * \param [in] signalsReceiver is a pointer to SignalsReceiver object for this thread, nullptr to disable reception
- * of signals for this thread
- * \param [in] owner is a reference to Thread object that owns this ThreadControlBlock
- */
-
- ThreadControlBlock(architecture::Stack&& stack, uint8_t priority, SchedulingPolicy schedulingPolicy,
- ThreadGroupControlBlock* threadGroupControlBlock, SignalsReceiver* signalsReceiver, Thread& owner);
-
- /**
- * \brief ThreadControlBlock's destructor
- */
-
- ~ThreadControlBlock();
-
- /**
- * \brief Hook function executed when thread is added to scheduler.
- *
- * If threadGroupControlBlock_ is nullptr, it is inherited from currently running thread. Then this object is added
- * to the thread group (if it is valid).
- *
- * \attention This function should be called only by Scheduler::addInternal().
- *
- * \return 0 on success, error code otherwise:
- * - EINVAL - inherited thread group is invalid;
- */
-
- int addHook();
-
- /**
- * \brief Block hook function of thread
- *
- * Saves pointer to UnblockFunctor.
- *
- * \attention This function should be called only by Scheduler::blockInternal().
- *
- * \param [in] unblockFunctor is a pointer to UnblockFunctor which will be executed in unblockHook()
- */
-
- void blockHook(const UnblockFunctor* const unblockFunctor)
- {
- unblockFunctor_ = unblockFunctor;
- }
-
- /**
- * \return pointer to list that has this object
- */
-
- ThreadList* getList() const
- {
- return list_;
- }
-
- /**
- * \return reference to list of mutexes (mutex control blocks) with enabled priority protocol owned by this thread
- */
-
- MutexList& getOwnedProtocolMutexList()
- {
- return ownedProtocolMutexList_;
- }
-
- /**
- * \return reference to Thread object that owns this ThreadControlBlock
- */
-
- Thread& getOwner() const
- {
- return owner_;
- }
-
- /**
- * \return reference to internal RoundRobinQuantum object
- */
-
- RoundRobinQuantum& getRoundRobinQuantum()
- {
- return roundRobinQuantum_;
- }
-
- /**
- * \return scheduling policy of the thread
- */
-
- SchedulingPolicy getSchedulingPolicy() const
- {
- return schedulingPolicy_;
- }
-
- /**
- * \return pointer to SignalsReceiverControlBlock object for this thread, nullptr if this thread cannot receive
- * signals
- */
-
- SignalsReceiverControlBlock* getSignalsReceiverControlBlock() const
- {
- return signalsReceiverControlBlock_;
- }
-
- /**
- * \return reference to internal Stack object
- */
-
- architecture::Stack& getStack()
- {
- return stack_;
- }
-
- /**
- * \return current state of object
- */
-
- ThreadState getState() const
- {
- return state_;
- }
-
- /**
- * \brief Sets the list that has this object.
- *
- * \param [in] list is a pointer to list that has this object
- */
-
- void setList(ThreadList* const list)
- {
- list_ = list;
- }
-
- /**
- * \brief Changes priority of thread.
- *
- * If the priority really changes, the position in the thread list is adjusted and context switch may be requested.
- *
- * \param [in] priority is the new priority of thread
- * \param [in] alwaysBehind selects the method of ordering when lowering the priority
- * - false - the thread is moved to the head of the group of threads with the new priority (default),
- * - true - the thread is moved to the tail of the group of threads with the new priority.
- */
-
- void setPriority(uint8_t priority, bool alwaysBehind = {});
-
- /**
- * \param [in] priorityInheritanceMutexControlBlock is a pointer to MutexControlBlock (with PriorityInheritance
- * protocol) that blocks this thread
- */
-
- void setPriorityInheritanceMutexControlBlock(const MutexControlBlock* const priorityInheritanceMutexControlBlock)
- {
- priorityInheritanceMutexControlBlock_ = priorityInheritanceMutexControlBlock;
- }
-
- /**
- * param [in] schedulingPolicy is the new scheduling policy of the thread
- */
-
- void setSchedulingPolicy(SchedulingPolicy schedulingPolicy);
-
- /**
- * \param [in] state is the new state of object
- */
-
- void setState(const ThreadState state)
- {
- state_ = state;
- }
-
- /**
- * \brief Hook function called when context is switched to this thread.
- *
- * Sets global _impure_ptr (from newlib) to thread's \a reent_ member variable.
- *
- * \attention This function should be called only by Scheduler::switchContext().
- */
-
- void switchedToHook()
- {
- _impure_ptr = &reent_;
- }
-
- /**
- * \brief Unblock hook function of thread
- *
- * Resets round-robin's quantum and executes unblock functor saved in blockHook().
- *
- * \attention This function should be called only by Scheduler::unblockInternal().
- *
- * \param [in] unblockReason is the new reason of unblocking of the thread
- */
-
- void unblockHook(UnblockReason unblockReason);
-
- /**
- * \brief Updates boosted priority of the thread.
- *
- * This function should be called after all operations involving this thread and a mutex with enabled priority
- * protocol.
- *
- * \param [in] boostedPriority is the initial boosted priority, this should be effective priority of the thread that
- * is about to be blocked on a mutex owned by this thread, default - 0
- */
-
- void updateBoostedPriority(uint8_t boostedPriority = {});
-
- ThreadControlBlock(const ThreadControlBlock&) = delete;
- ThreadControlBlock(ThreadControlBlock&&) = default;
- const ThreadControlBlock& operator=(const ThreadControlBlock&) = delete;
- ThreadControlBlock& operator=(ThreadControlBlock&&) = delete;
-
-private:
-
- /**
- * \brief Repositions the thread on the list it's currently on.
- *
- * This function should be called when thread's effective priority changes.
- *
- * \attention list_ must not be nullptr
- *
- * \param [in] loweringBefore selects the method of ordering when lowering the priority (it must be false when the
- * priority is raised!):
- * - true - the thread is moved to the head of the group of threads with the new priority, this is accomplished by
- * temporarily boosting effective priority by 1,
- * - false - the thread is moved to the tail of the group of threads with the new priority.
- */
-
- void reposition(bool loweringBefore);
-
- /// internal stack object
- architecture::Stack stack_;
-
- /// reference to Thread object that owns this ThreadControlBlock
- Thread& owner_;
-
- /// list of mutexes (mutex control blocks) with enabled priority protocol owned by this thread
- MutexList ownedProtocolMutexList_;
-
- /// pointer to MutexControlBlock (with PriorityInheritance protocol) that blocks this thread
- const MutexControlBlock* priorityInheritanceMutexControlBlock_;
-
- /// pointer to list that has this object
- ThreadList* list_;
-
- /// pointer to ThreadGroupControlBlock with which this object is associated
- ThreadGroupControlBlock* threadGroupControlBlock_;
-
- /// functor executed in unblockHook()
- const UnblockFunctor* unblockFunctor_;
-
- /// pointer to SignalsReceiverControlBlock object for this thread, nullptr if this thread cannot receive signals
- SignalsReceiverControlBlock* signalsReceiverControlBlock_;
-
- /// newlib's _reent structure with thread-specific data
- _reent reent_;
-
- /// round-robin quantum
- RoundRobinQuantum roundRobinQuantum_;
-
- /// scheduling policy of the thread
- SchedulingPolicy schedulingPolicy_;
-
- /// current state of object
- ThreadState state_;
-};
-
-} // namespace internal
-
-} // namespace distortos
-
-#endif // INCLUDE_DISTORTOS_INTERNAL_SCHEDULER_THREADCONTROLBLOCK_HPP_