summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-01 11:12:52 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-09-08 09:55:27 +0200
commite27421f38661ea18b2a663776ad524afadeba607 (patch)
tree798d9620df6f33ca884c4ce81cbc5a6cb5abd4c3 /cpukit/score
parentscore: Optimize thread queue enqueue (diff)
downloadrtems-e27421f38661ea18b2a663776ad524afadeba607.tar.bz2
score: Move scheduler node to own header file
This makes it possible to add scheduler nodes to structures defined in <rtems/score/thread.h>. Update #2556.
Diffstat (limited to '')
-rw-r--r--cpukit/score/Makefile.am1
-rw-r--r--cpukit/score/include/rtems/score/scheduler.h159
-rw-r--r--cpukit/score/include/rtems/score/schedulernode.h188
-rw-r--r--cpukit/score/include/rtems/score/thread.h7
-rw-r--r--cpukit/score/preinstall.am4
5 files changed, 196 insertions, 163 deletions
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 4a07cbed8a..c12820b964 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -72,6 +72,7 @@ include_rtems_score_HEADERS += include/rtems/score/schedulercbs.h
include_rtems_score_HEADERS += include/rtems/score/schedulercbsimpl.h
include_rtems_score_HEADERS += include/rtems/score/scheduleredf.h
include_rtems_score_HEADERS += include/rtems/score/scheduleredfimpl.h
+include_rtems_score_HEADERS += include/rtems/score/schedulernode.h
include_rtems_score_HEADERS += include/rtems/score/schedulerpriority.h
include_rtems_score_HEADERS += include/rtems/score/schedulerpriorityimpl.h
include_rtems_score_HEADERS += include/rtems/score/schedulerprioritysmp.h
diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h
index 0a6d68208a..bbb4e37240 100644
--- a/cpukit/score/include/rtems/score/scheduler.h
+++ b/cpukit/score/include/rtems/score/scheduler.h
@@ -19,8 +19,6 @@
#ifndef _RTEMS_SCORE_SCHEDULER_H
#define _RTEMS_SCORE_SCHEDULER_H
-#include <rtems/score/priority.h>
-#include <rtems/score/smplockseq.h>
#include <rtems/score/thread.h>
#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) && defined(RTEMS_SMP)
#include <sys/cpuset.h>
@@ -44,8 +42,6 @@ struct Per_CPU_Control;
typedef struct Scheduler_Control Scheduler_Control;
-typedef struct Scheduler_Node Scheduler_Node;
-
#if defined(RTEMS_SMP)
typedef Thread_Control * Scheduler_Void_or_thread;
@@ -223,161 +219,6 @@ struct Scheduler_Control {
uint32_t name;
};
-#if defined(RTEMS_SMP)
-/**
- * @brief State to indicate potential help for other threads.
- *
- * @dot
- * digraph state {
- * y [label="HELP YOURSELF"];
- * ao [label="HELP ACTIVE OWNER"];
- * ar [label="HELP ACTIVE RIVAL"];
- *
- * y -> ao [label="obtain"];
- * y -> ar [label="wait for obtain"];
- * ao -> y [label="last release"];
- * ao -> r [label="wait for obtain"];
- * ar -> r [label="timeout"];
- * ar -> ao [label="timeout"];
- * }
- * @enddot
- */
-typedef enum {
- /**
- * @brief This scheduler node is solely used by the owner thread.
- *
- * This thread owns no resources using a helping protocol and thus does not
- * take part in the scheduler helping protocol. No help will be provided for
- * other thread.
- */
- SCHEDULER_HELP_YOURSELF,
-
- /**
- * @brief This scheduler node is owned by a thread actively owning a resource.
- *
- * This scheduler node can be used to help out threads.
- *
- * In case this scheduler node changes its state from ready to scheduled and
- * the thread executes using another node, then an idle thread will be
- * provided as a user of this node to temporarily execute on behalf of the
- * owner thread. Thus lower priority threads are denied access to the
- * processors of this scheduler instance.
- *
- * In case a thread actively owning a resource performs a blocking operation,
- * then an idle thread will be used also in case this node is in the
- * scheduled state.
- */
- SCHEDULER_HELP_ACTIVE_OWNER,
-
- /**
- * @brief This scheduler node is owned by a thread actively obtaining a
- * resource currently owned by another thread.
- *
- * This scheduler node can be used to help out threads.
- *
- * The thread owning this node is ready and will give away its processor in
- * case the thread owning the resource asks for help.
- */
- SCHEDULER_HELP_ACTIVE_RIVAL,
-
- /**
- * @brief This scheduler node is owned by a thread obtaining a
- * resource currently owned by another thread.
- *
- * This scheduler node can be used to help out threads.
- *
- * The thread owning this node is blocked.
- */
- SCHEDULER_HELP_PASSIVE
-} Scheduler_Help_state;
-#endif
-
-/**
- * @brief Scheduler node for per-thread data.
- */
-struct Scheduler_Node {
-#if defined(RTEMS_SMP)
- /**
- * @brief Chain node for usage in various scheduler data structures.
- *
- * Strictly this is the wrong place for this field since the data structures
- * to manage scheduler nodes belong to the particular scheduler
- * implementation. Currently all SMP scheduler implementations use chains.
- * The node is here to simplify things, just like the object node in the
- * thread control block. It may be replaced with a union to add a red-black
- * tree node in the future.
- */
- Chain_Node Node;
-
- /**
- * @brief The thread using this node.
- */
- Thread_Control *user;
-
- /**
- * @brief The help state of this node.
- */
- Scheduler_Help_state help_state;
-
- /**
- * @brief The thread owning this node.
- */
- Thread_Control *owner;
-
- /**
- * @brief The idle thread claimed by this node in case the help state is
- * SCHEDULER_HELP_ACTIVE_OWNER.
- *
- * Active owners will lend their own node to an idle thread in case they
- * execute currently using another node or in case they perform a blocking
- * operation. This is necessary to ensure the priority ceiling protocols
- * work across scheduler boundaries.
- */
- Thread_Control *idle;
-
- /**
- * @brief The thread accepting help by this node in case the help state is
- * not SCHEDULER_HELP_YOURSELF.
- */
- Thread_Control *accepts_help;
-#endif
-
- /**
- * @brief The thread priority information used by the scheduler.
- *
- * The thread priority is manifest in two independent areas. One area is the
- * user visible thread priority along with a potential thread queue. The
- * other is the scheduler. During a thread priority change, the user visible
- * thread priority and the thread queue are first updated and the thread
- * priority value here is changed. Once this is done the scheduler is
- * notified via the update priority operation, so that it can update its
- * internal state and honour a new thread priority value.
- */
- struct {
- /**
- * @brief The thread priority value of this scheduler node.
- *
- * The producer of this value is _Thread_Change_priority(). The consumer
- * is the scheduler via the unblock and update priority operations.
- */
- Priority_Control value;
-
-#if defined(RTEMS_SMP)
- /**
- * @brief Sequence lock to synchronize priority value updates.
- */
- SMP_sequence_lock_Control Lock;
-#endif
-
- /**
- * @brief In case a priority update is necessary and this is true, then
- * enqueue the thread as the first of its priority group, otherwise enqueue
- * the thread as the last of its priority group.
- */
- bool prepend_it;
- } Priority;
-};
-
/**
* @brief Registered schedulers.
*
diff --git a/cpukit/score/include/rtems/score/schedulernode.h b/cpukit/score/include/rtems/score/schedulernode.h
new file mode 100644
index 0000000000..6153624743
--- /dev/null
+++ b/cpukit/score/include/rtems/score/schedulernode.h
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _RTEMS_SCORE_SCHEDULERNODE_H
+#define _RTEMS_SCORE_SCHEDULERNODE_H
+
+#include <rtems/score/basedefs.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/smplockseq.h>
+
+struct _Thread_Control;
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#if defined(RTEMS_SMP)
+/**
+ * @brief State to indicate potential help for other threads.
+ *
+ * @dot
+ * digraph state {
+ * y [label="HELP YOURSELF"];
+ * ao [label="HELP ACTIVE OWNER"];
+ * ar [label="HELP ACTIVE RIVAL"];
+ *
+ * y -> ao [label="obtain"];
+ * y -> ar [label="wait for obtain"];
+ * ao -> y [label="last release"];
+ * ao -> r [label="wait for obtain"];
+ * ar -> r [label="timeout"];
+ * ar -> ao [label="timeout"];
+ * }
+ * @enddot
+ */
+typedef enum {
+ /**
+ * @brief This scheduler node is solely used by the owner thread.
+ *
+ * This thread owns no resources using a helping protocol and thus does not
+ * take part in the scheduler helping protocol. No help will be provided for
+ * other thread.
+ */
+ SCHEDULER_HELP_YOURSELF,
+
+ /**
+ * @brief This scheduler node is owned by a thread actively owning a resource.
+ *
+ * This scheduler node can be used to help out threads.
+ *
+ * In case this scheduler node changes its state from ready to scheduled and
+ * the thread executes using another node, then an idle thread will be
+ * provided as a user of this node to temporarily execute on behalf of the
+ * owner thread. Thus lower priority threads are denied access to the
+ * processors of this scheduler instance.
+ *
+ * In case a thread actively owning a resource performs a blocking operation,
+ * then an idle thread will be used also in case this node is in the
+ * scheduled state.
+ */
+ SCHEDULER_HELP_ACTIVE_OWNER,
+
+ /**
+ * @brief This scheduler node is owned by a thread actively obtaining a
+ * resource currently owned by another thread.
+ *
+ * This scheduler node can be used to help out threads.
+ *
+ * The thread owning this node is ready and will give away its processor in
+ * case the thread owning the resource asks for help.
+ */
+ SCHEDULER_HELP_ACTIVE_RIVAL,
+
+ /**
+ * @brief This scheduler node is owned by a thread obtaining a
+ * resource currently owned by another thread.
+ *
+ * This scheduler node can be used to help out threads.
+ *
+ * The thread owning this node is blocked.
+ */
+ SCHEDULER_HELP_PASSIVE
+} Scheduler_Help_state;
+#endif
+
+/**
+ * @brief Scheduler node for per-thread data.
+ */
+typedef struct {
+#if defined(RTEMS_SMP)
+ /**
+ * @brief Chain node for usage in various scheduler data structures.
+ *
+ * Strictly this is the wrong place for this field since the data structures
+ * to manage scheduler nodes belong to the particular scheduler
+ * implementation. Currently all SMP scheduler implementations use chains.
+ * The node is here to simplify things, just like the object node in the
+ * thread control block. It may be replaced with a union to add a red-black
+ * tree node in the future.
+ */
+ Chain_Node Node;
+
+ /**
+ * @brief The thread using this node.
+ */
+ struct _Thread_Control *user;
+
+ /**
+ * @brief The help state of this node.
+ */
+ Scheduler_Help_state help_state;
+
+ /**
+ * @brief The thread owning this node.
+ */
+ struct _Thread_Control *owner;
+
+ /**
+ * @brief The idle thread claimed by this node in case the help state is
+ * SCHEDULER_HELP_ACTIVE_OWNER.
+ *
+ * Active owners will lend their own node to an idle thread in case they
+ * execute currently using another node or in case they perform a blocking
+ * operation. This is necessary to ensure the priority ceiling protocols
+ * work across scheduler boundaries.
+ */
+ struct _Thread_Control *idle;
+
+ /**
+ * @brief The thread accepting help by this node in case the help state is
+ * not SCHEDULER_HELP_YOURSELF.
+ */
+ struct _Thread_Control *accepts_help;
+#endif
+
+ /**
+ * @brief The thread priority information used by the scheduler.
+ *
+ * The thread priority is manifest in two independent areas. One area is the
+ * user visible thread priority along with a potential thread queue. The
+ * other is the scheduler. During a thread priority change, the user visible
+ * thread priority and the thread queue are first updated and the thread
+ * priority value here is changed. Once this is done the scheduler is
+ * notified via the update priority operation, so that it can update its
+ * internal state and honour a new thread priority value.
+ */
+ struct {
+ /**
+ * @brief The thread priority value of this scheduler node.
+ *
+ * The producer of this value is _Thread_Change_priority(). The consumer
+ * is the scheduler via the unblock and update priority operations.
+ */
+ Priority_Control value;
+
+#if defined(RTEMS_SMP)
+ /**
+ * @brief Sequence lock to synchronize priority value updates.
+ */
+ SMP_sequence_lock_Control Lock;
+#endif
+
+ /**
+ * @brief In case a priority update is necessary and this is true, then
+ * enqueue the thread as the first of its priority group, otherwise enqueue
+ * the thread as the last of its priority group.
+ */
+ bool prepend_it;
+ } Priority;
+} Scheduler_Node;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_SCORE_SCHEDULERNODE_H */
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
index 6104ba03d7..2df0269491 100644
--- a/cpukit/score/include/rtems/score/thread.h
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -30,6 +30,7 @@
#include <rtems/score/object.h>
#include <rtems/score/priority.h>
#include <rtems/score/resource.h>
+#include <rtems/score/schedulernode.h>
#include <rtems/score/stack.h>
#include <rtems/score/states.h>
#include <rtems/score/threadq.h>
@@ -46,8 +47,6 @@ struct Per_CPU_Control;
struct Scheduler_Control;
-struct Scheduler_Node;
-
struct User_extensions_Iterator;
#ifdef __cplusplus
@@ -653,7 +652,7 @@ typedef struct {
* This field is constant after initialization. It is used by change
* priority and ask for help operations.
*/
- struct Scheduler_Node *own_node;
+ Scheduler_Node *own_node;
#endif
/**
@@ -665,7 +664,7 @@ typedef struct {
* On SMP configurations the scheduler helping protocol may change this
* field.
*/
- struct Scheduler_Node *node;
+ Scheduler_Node *node;
#if defined(RTEMS_SMP)
/**
diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
index 1ba332d098..85527c6f70 100644
--- a/cpukit/score/preinstall.am
+++ b/cpukit/score/preinstall.am
@@ -256,6 +256,10 @@ $(PROJECT_INCLUDE)/rtems/score/scheduleredfimpl.h: include/rtems/score/scheduler
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/scheduleredfimpl.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/scheduleredfimpl.h
+$(PROJECT_INCLUDE)/rtems/score/schedulernode.h: include/rtems/score/schedulernode.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulernode.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulernode.h
+
$(PROJECT_INCLUDE)/rtems/score/schedulerpriority.h: include/rtems/score/schedulerpriority.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulerpriority.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulerpriority.h