diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-09-23 13:24:06 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-02 10:05:42 +0100 |
commit | ebdd2a343181ef5f3fc2f1330930b0ea5c0ed8a4 (patch) | |
tree | d3d50b10d232eb7e1ccc743b07b8f7ab1d195660 /cpukit/score/include/rtems/score/schedulernode.h | |
parent | score: Protect thread CPU by thread scheduler lock (diff) | |
download | rtems-ebdd2a343181ef5f3fc2f1330930b0ea5c0ed8a4.tar.bz2 |
score: Add scheduler node requests
Add the ability to add/remove scheduler nodes to/from the set of
scheduler nodes available to the schedulers for a particular thread.
Update #2556.
Diffstat (limited to 'cpukit/score/include/rtems/score/schedulernode.h')
-rw-r--r-- | cpukit/score/include/rtems/score/schedulernode.h | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/cpukit/score/include/rtems/score/schedulernode.h b/cpukit/score/include/rtems/score/schedulernode.h index 2397ba4b79..2e0c2afb88 100644 --- a/cpukit/score/include/rtems/score/schedulernode.h +++ b/cpukit/score/include/rtems/score/schedulernode.h @@ -95,10 +95,43 @@ typedef enum { } Scheduler_Help_state; #endif +#if defined(RTEMS_SMP) +/** + * @brief The scheduler node requests. + */ +typedef enum { + /** + * @brief The scheduler node is not on the list of pending requests. + */ + SCHEDULER_NODE_REQUEST_NOT_PENDING, + + /** + * @brief There is a pending scheduler node request to add this scheduler + * node to the Thread_Control::Scheduler::Scheduler_nodes chain. + */ + SCHEDULER_NODE_REQUEST_ADD, + + /** + * @brief There is a pending scheduler node request to remove this scheduler + * node from the Thread_Control::Scheduler::Scheduler_nodes chain. + */ + SCHEDULER_NODE_REQUEST_REMOVE, + + /** + * @brief The scheduler node is on the list of pending requests, but nothing + * should change. + */ + SCHEDULER_NODE_REQUEST_NOTHING, + +} Scheduler_Node_request; +#endif + +typedef struct Scheduler_Node Scheduler_Node; + /** * @brief Scheduler node for per-thread data. */ -typedef struct Scheduler_Node { +struct Scheduler_Node { #if defined(RTEMS_SMP) /** * @brief Chain node for usage in various scheduler data structures. @@ -149,6 +182,28 @@ typedef struct Scheduler_Node { * Thread_Control::Scheduler::Wait_nodes. */ Chain_Node Wait_node; + + /** + * @brief Node to add this scheduler node to + * Thread_Control::Scheduler::Scheduler_nodes. + */ + union { + /** + * @brief The node for Thread_Control::Scheduler::Scheduler_nodes. + */ + Chain_Node Chain; + } Scheduler_node; + + /** + * @brief Link to the next scheduler node in the + * Thread_Control::Scheduler::requests list. + */ + Scheduler_Node *next_request; + + /** + * @brief The current scheduler node request. + */ + Scheduler_Node_request request; } Thread; #endif @@ -198,7 +253,7 @@ typedef struct Scheduler_Node { */ bool prepend_it; } Priority; -} Scheduler_Node; +}; #if defined(RTEMS_SMP) /** @@ -212,6 +267,9 @@ extern const size_t _Scheduler_Node_size; #if defined(RTEMS_SMP) #define SCHEDULER_NODE_OF_THREAD_WAIT_NODE( node ) \ RTEMS_CONTAINER_OF( node, Scheduler_Node, Thread.Wait_node ) + +#define SCHEDULER_NODE_OF_THREAD_SCHEDULER_NODE( node ) \ + RTEMS_CONTAINER_OF( node, Scheduler_Node, Thread.Scheduler_node.Chain ) #endif #ifdef __cplusplus |