summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-04-21 10:17:13 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-05-19 12:00:45 +0200
commit568af83542eec9343c24d417ed6a219d22046233 (patch)
treef66fde552c81c31930df66cb8a00444efeb0f30a /cpukit/score/include
parentscore: Add Thread_queue_Control::Lock (diff)
downloadrtems-568af83542eec9343c24d417ed6a219d22046233.tar.bz2
score: Add Thread_queue_Operations
Replace the Thread_Priority_control with more general Thread_queue_Operations which will be used for generic priority change, timeout, signal and wait queue operations in the future. Update #2273.
Diffstat (limited to 'cpukit/score/include')
-rw-r--r--cpukit/score/include/rtems/score/thread.h86
-rw-r--r--cpukit/score/include/rtems/score/threadimpl.h88
-rw-r--r--cpukit/score/include/rtems/score/threadq.h49
-rw-r--r--cpukit/score/include/rtems/score/threadqimpl.h6
4 files changed, 134 insertions, 95 deletions
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
index 1a73fdaa8a..bce6f5643e 100644
--- a/cpukit/score/include/rtems/score/thread.h
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -249,56 +249,6 @@ typedef struct {
} Thread_Start_information;
/**
- * @brief Priority change handler.
- *
- * @param[in] the_thread The thread.
- * @param[in] new_priority The new priority value.
- * @param[in] context The handler context.
- *
- * @see _Thread_Priority_set_change_handler().
- */
-typedef void (*Thread_Priority_change_handler)(
- Thread_Control *the_thread,
- Priority_Control new_priority,
- void *context
-);
-
-/**
- * @brief Thread priority control.
- */
-typedef struct {
- /**
- * @brief Generation of the current priority value.
- *
- * It is used in _Thread_Change_priority() to serialize the update of
- * priority related data structures.
- */
- uint32_t generation;
-
- /**
- * @brief Priority change handler.
- *
- * Called by _Thread_Change_priority() to notify a thread about a priority
- * change. In case this thread waits currently for a resource the handler
- * may adjust its data structures according to the new priority value. This
- * handler must not be NULL, instead the default handler
- * _Thread_Priority_change_do_nothing() should be used in case nothing needs
- * to be done during a priority change.
- *
- * @see _Thread_Priority_set_change_handler() and
- * _Thread_Priority_restore_default_change_handler().
- */
- Thread_Priority_change_handler change_handler;
-
- /**
- * @brief Context for priority change handler.
- *
- * @see _Thread_Priority_set_change_handler().
- */
- void *change_handler_context;
-} Thread_Priority_control;
-
-/**
* @brief Union type to hold a pointer to an immutable or a mutable object.
*
* The main purpose is to enable passing of pointers to read-only send buffers
@@ -359,7 +309,14 @@ typedef struct {
*/
uint32_t timeout_code;
- /** This field points to the thread queue on which this thread is blocked. */
+ /**
+ * @brief The current thread queue.
+ *
+ * In case this field is @c NULL, then the thread is not blocked on a thread
+ * queue. This field is protected by the thread lock.
+ *
+ * @see _Thread_Lock_set() and _Thread_Wait_set_queue().
+ */
Thread_queue_Control *queue;
/**
@@ -371,6 +328,15 @@ typedef struct {
#else
Thread_Wait_flags flags;
#endif
+
+ /**
+ * @brief The current thread queue operations.
+ *
+ * This field is protected by the thread lock.
+ *
+ * @see _Thread_Lock_set() and _Thread_Wait_set_operations().
+ */
+ const Thread_queue_Operations *operations;
} Thread_Wait_information;
/**
@@ -393,9 +359,12 @@ typedef struct {
Priority_Control real_priority;
/**
- * @brief Thread priority control.
+ * @brief Generation of the current priority value.
+ *
+ * It is used in _Thread_Change_priority() to serialize the update of
+ * priority related data structures.
*/
- Thread_Priority_control Priority;
+ uint32_t priority_generation;
/** This field is the number of mutexes currently held by this proxy. */
uint32_t resource_count;
@@ -638,8 +607,8 @@ typedef struct {
*
* The thread lock protects the following thread variables
* - Thread_Control::current_priority,
- * - Thread_Control::Priority::change_handler, and
- * - Thread_Control::Priority::change_handler_context.
+ * - Thread_Control::Wait::queue, and
+ * - Thread_Control::Wait::operations.
*
* @see _Thread_Lock_acquire(), _Thread_Lock_release(), _Thread_Lock_set() and
* _Thread_Lock_restore_default().
@@ -679,9 +648,12 @@ struct Thread_Control_struct {
Priority_Control real_priority;
/**
- * @brief Thread priority control.
+ * @brief Generation of the current priority value.
+ *
+ * It is used in _Thread_Change_priority() to serialize the update of
+ * priority related data structures.
*/
- Thread_Priority_control Priority;
+ uint32_t priority_generation;
/** This field is the number of mutexes currently held by this thread. */
uint32_t resource_count;
diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h
index c266a9cce3..953b88b925 100644
--- a/cpukit/score/include/rtems/score/threadimpl.h
+++ b/cpukit/score/include/rtems/score/threadimpl.h
@@ -30,6 +30,7 @@
#include <rtems/score/resourceimpl.h>
#include <rtems/score/statesimpl.h>
#include <rtems/score/sysstate.h>
+#include <rtems/score/threadqimpl.h>
#include <rtems/score/todimpl.h>
#include <rtems/config.h>
@@ -1078,41 +1079,6 @@ RTEMS_INLINE_ROUTINE void _Thread_Lock_restore_default(
do { } while ( 0 )
#endif
-void _Thread_Priority_change_do_nothing(
- Thread_Control *the_thread,
- Priority_Control new_priority,
- void *context
-);
-
-/**
- * @brief Sets the thread priority change handler and its context.
- *
- * @param[in] the_thread The thread.
- * @param[in] new_handler The new handler.
- * @param[in] new_context The new handler context.
- */
-RTEMS_INLINE_ROUTINE void _Thread_Priority_set_change_handler(
- Thread_Control *the_thread,
- Thread_Priority_change_handler new_handler,
- void *new_context
-)
-{
- the_thread->Priority.change_handler = new_handler;
- the_thread->Priority.change_handler_context = new_context;
-}
-
-/**
- * @brief Restores the thread priority change default handler and its context.
- *
- * @param[in] the_thread The thread.
- */
-RTEMS_INLINE_ROUTINE void _Thread_Priority_restore_default_change_handler(
- Thread_Control *the_thread
-)
-{
- the_thread->Priority.change_handler = _Thread_Priority_change_do_nothing;
-}
-
/**
* @brief The initial thread wait flags value set by _Thread_Initialize().
*/
@@ -1258,6 +1224,58 @@ RTEMS_INLINE_ROUTINE bool _Thread_Wait_flags_try_change(
}
/**
+ * @brief Sets the thread queue.
+ *
+ * The caller must be the owner of the thread lock.
+ *
+ * @param[in] the_thread The thread.
+ * @param[in] new_queue The new queue.
+ *
+ * @see _Thread_Lock_set().
+ */
+RTEMS_INLINE_ROUTINE void _Thread_Wait_set_queue(
+ Thread_Control *the_thread,
+ Thread_queue_Control *new_queue
+)
+{
+ the_thread->Wait.queue = new_queue;
+}
+
+/**
+ * @brief Sets the thread queue operations.
+ *
+ * The caller must be the owner of the thread lock.
+ *
+ * @param[in] the_thread The thread.
+ * @param[in] new_operations The new queue operations.
+ *
+ * @see _Thread_Lock_set() and _Thread_Wait_restore_default_operations().
+ */
+RTEMS_INLINE_ROUTINE void _Thread_Wait_set_operations(
+ Thread_Control *the_thread,
+ const Thread_queue_Operations *new_operations
+)
+{
+ the_thread->Wait.operations = new_operations;
+}
+
+/**
+ * @brief Restores the default thread queue operations.
+ *
+ * The caller must be the owner of the thread lock.
+ *
+ * @param[in] the_thread The thread.
+ *
+ * @see _Thread_Wait_set_operations().
+ */
+RTEMS_INLINE_ROUTINE void _Thread_Wait_restore_default_operations(
+ Thread_Control *the_thread
+)
+{
+ the_thread->Wait.operations = &_Thread_queue_Operations_default;
+}
+
+/**
* @brief Sets the thread wait timeout code.
*
* @param[in] the_thread The thread.
diff --git a/cpukit/score/include/rtems/score/threadq.h b/cpukit/score/include/rtems/score/threadq.h
index 1f99ffde04..c483b87620 100644
--- a/cpukit/score/include/rtems/score/threadq.h
+++ b/cpukit/score/include/rtems/score/threadq.h
@@ -21,9 +21,11 @@
#include <rtems/score/chain.h>
#include <rtems/score/isrlock.h>
+#include <rtems/score/percpu.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/rbtree.h>
#include <rtems/score/states.h>
#include <rtems/score/threadsync.h>
-#include <rtems/score/rbtree.h>
#ifdef __cplusplus
extern "C" {
@@ -40,6 +42,42 @@ extern "C" {
*/
/**@{*/
+typedef struct Thread_queue_Control Thread_queue_Control;
+
+/**
+ * @brief Thread queue priority change operation.
+ *
+ * @param[in] the_thread The thread.
+ * @param[in] new_priority The new priority value.
+ * @param[in] queue The thread queue.
+ *
+ * @see Thread_queue_Operations.
+ */
+typedef void ( *Thread_queue_Priority_change_operation )(
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ Thread_queue_Control *queue
+);
+
+/**
+ * @brief Thread queue operations.
+ *
+ * @see _Thread_wait_Set_operations().
+ */
+typedef struct {
+ /**
+ * @brief Thread queue priority change operation.
+ *
+ * Called by _Thread_Change_priority() to notify a thread about a priority
+ * change. In case this thread waits currently for a resource the handler
+ * may adjust its data structures according to the new priority value. This
+ * handler must not be NULL, instead the default handler
+ * _Thread_Do_nothing_priority_change() should be used in case nothing needs
+ * to be done during a priority change.
+ */
+ Thread_queue_Priority_change_operation priority_change;
+} Thread_queue_Operations;
+
/**
* The following enumerated type details all of the disciplines
* supported by the Thread Queue Handler.
@@ -53,7 +91,7 @@ typedef enum {
* This is the structure used to manage sets of tasks which are blocked
* waiting to acquire a resource.
*/
-typedef struct {
+struct Thread_queue_Control {
/** This union contains the data structures used to manage the blocked
* set of tasks which varies based upon the discipline.
*/
@@ -65,6 +103,11 @@ typedef struct {
} Queues;
/**
+ * @brief The operations for this thread queue.
+ */
+ const Thread_queue_Operations *operations;
+
+ /**
* @brief Lock to protect this thread queue.
*
* It may be used to protect additional state of the object embedding this
@@ -83,7 +126,7 @@ typedef struct {
* waiting on this thread queue.
*/
uint32_t timeout_status;
-} Thread_queue_Control;
+};
/**@}*/
diff --git a/cpukit/score/include/rtems/score/threadqimpl.h b/cpukit/score/include/rtems/score/threadqimpl.h
index 3595dc5d85..04e67309b2 100644
--- a/cpukit/score/include/rtems/score/threadqimpl.h
+++ b/cpukit/score/include/rtems/score/threadqimpl.h
@@ -281,6 +281,12 @@ RBTree_Compare_result _Thread_queue_Compare_priority(
const RBTree_Node *right
);
+extern const Thread_queue_Operations _Thread_queue_Operations_default;
+
+extern const Thread_queue_Operations _Thread_queue_Operations_FIFO;
+
+extern const Thread_queue_Operations _Thread_queue_Operations_priority;
+
/**@}*/
#ifdef __cplusplus