diff options
Diffstat (limited to 'cpukit/score/include')
-rw-r--r-- | cpukit/score/include/rtems/score/corebarrier.h | 2 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/corebarrierimpl.h | 1 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/coremsg.h | 3 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/coremsgimpl.h | 1 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/coremuteximpl.h | 1 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/corerwlock.h | 2 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/corerwlockimpl.h | 1 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/coresem.h | 2 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/coresemimpl.h | 4 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/mpci.h | 1 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/thread.h | 2 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/threadq.h | 412 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/threadqimpl.h | 428 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/tqdata.h | 118 |
14 files changed, 499 insertions, 479 deletions
diff --git a/cpukit/score/include/rtems/score/corebarrier.h b/cpukit/score/include/rtems/score/corebarrier.h index 1505efc55e..ed4bd84d58 100644 --- a/cpukit/score/include/rtems/score/corebarrier.h +++ b/cpukit/score/include/rtems/score/corebarrier.h @@ -19,7 +19,7 @@ #ifndef _RTEMS_SCORE_COREBARRIER_H #define _RTEMS_SCORE_COREBARRIER_H -#include <rtems/score/tqdata.h> +#include <rtems/score/threadq.h> #ifdef __cplusplus extern "C" { diff --git a/cpukit/score/include/rtems/score/corebarrierimpl.h b/cpukit/score/include/rtems/score/corebarrierimpl.h index 0353efb67d..f2bcf6af23 100644 --- a/cpukit/score/include/rtems/score/corebarrierimpl.h +++ b/cpukit/score/include/rtems/score/corebarrierimpl.h @@ -20,7 +20,6 @@ #define _RTEMS_SCORE_COREBARRIERIMPL_H #include <rtems/score/corebarrier.h> -#include <rtems/score/threadq.h> #include <rtems/score/watchdog.h> #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/coremsg.h b/cpukit/score/include/rtems/score/coremsg.h index 6e37c61a28..46df868829 100644 --- a/cpukit/score/include/rtems/score/coremsg.h +++ b/cpukit/score/include/rtems/score/coremsg.h @@ -19,9 +19,8 @@ #ifndef _RTEMS_SCORE_COREMSG_H #define _RTEMS_SCORE_COREMSG_H -#include <rtems/score/thread.h> +#include <rtems/score/chain.h> #include <rtems/score/threadq.h> -#include <rtems/score/priority.h> #include <rtems/score/watchdog.h> #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/coremsgimpl.h b/cpukit/score/include/rtems/score/coremsgimpl.h index d9f8f91c0b..c75a1a36f4 100644 --- a/cpukit/score/include/rtems/score/coremsgimpl.h +++ b/cpukit/score/include/rtems/score/coremsgimpl.h @@ -21,6 +21,7 @@ #include <rtems/score/coremsg.h> #include <rtems/score/chainimpl.h> +#include <rtems/score/threadqimpl.h> #include <limits.h> #include <string.h> diff --git a/cpukit/score/include/rtems/score/coremuteximpl.h b/cpukit/score/include/rtems/score/coremuteximpl.h index 756cd969cd..aa7f0d99cd 100644 --- a/cpukit/score/include/rtems/score/coremuteximpl.h +++ b/cpukit/score/include/rtems/score/coremuteximpl.h @@ -22,6 +22,7 @@ #include <rtems/score/chainimpl.h> #include <rtems/score/sysstate.h> #include <rtems/score/threadimpl.h> +#include <rtems/score/threadqimpl.h> #ifdef __cplusplus extern "C" { diff --git a/cpukit/score/include/rtems/score/corerwlock.h b/cpukit/score/include/rtems/score/corerwlock.h index 3ed511495e..d9b43c4d22 100644 --- a/cpukit/score/include/rtems/score/corerwlock.h +++ b/cpukit/score/include/rtems/score/corerwlock.h @@ -19,7 +19,7 @@ #ifndef _RTEMS_SCORE_CORERWLOCK_H #define _RTEMS_SCORE_CORERWLOCK_H -#include <rtems/score/tqdata.h> +#include <rtems/score/threadq.h> /** * @defgroup ScoreRWLock RWLock Handler diff --git a/cpukit/score/include/rtems/score/corerwlockimpl.h b/cpukit/score/include/rtems/score/corerwlockimpl.h index a47f400b49..b67c79f78f 100644 --- a/cpukit/score/include/rtems/score/corerwlockimpl.h +++ b/cpukit/score/include/rtems/score/corerwlockimpl.h @@ -20,7 +20,6 @@ #define _RTEMS_SCORE_CORERWLOCKIMPL_H #include <rtems/score/corerwlock.h> -#include <rtems/score/threadq.h> #include <rtems/score/watchdog.h> #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/coresem.h b/cpukit/score/include/rtems/score/coresem.h index 7a2040862a..fb9e6b2c33 100644 --- a/cpukit/score/include/rtems/score/coresem.h +++ b/cpukit/score/include/rtems/score/coresem.h @@ -21,7 +21,7 @@ #ifndef _RTEMS_SCORE_CORESEM_H #define _RTEMS_SCORE_CORESEM_H -#include <rtems/score/tqdata.h> +#include <rtems/score/threadq.h> #ifdef __cplusplus extern "C" { diff --git a/cpukit/score/include/rtems/score/coresemimpl.h b/cpukit/score/include/rtems/score/coresemimpl.h index 35fbce59d0..0a743bfccc 100644 --- a/cpukit/score/include/rtems/score/coresemimpl.h +++ b/cpukit/score/include/rtems/score/coresemimpl.h @@ -20,9 +20,7 @@ #define _RTEMS_SCORE_CORESEMIMPL_H #include <rtems/score/coresem.h> -#include <rtems/score/thread.h> -#include <rtems/score/threaddispatch.h> -#include <rtems/score/threadq.h> +#include <rtems/score/threadqimpl.h> #ifdef __cplusplus extern "C" { diff --git a/cpukit/score/include/rtems/score/mpci.h b/cpukit/score/include/rtems/score/mpci.h index 0932c4763e..3cb9386a2d 100644 --- a/cpukit/score/include/rtems/score/mpci.h +++ b/cpukit/score/include/rtems/score/mpci.h @@ -39,7 +39,6 @@ extern "C" { #include <rtems/score/mppkt.h> #include <rtems/score/thread.h> #include <rtems/score/threadq.h> -#include <rtems/score/tqdata.h> #include <rtems/score/watchdog.h> /** diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index c07350bc5a..d346ead6bc 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -28,7 +28,7 @@ #include <rtems/score/priority.h> #include <rtems/score/stack.h> #include <rtems/score/states.h> -#include <rtems/score/tqdata.h> +#include <rtems/score/threadq.h> #include <rtems/score/watchdog.h> #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/threadq.h b/cpukit/score/include/rtems/score/threadq.h index 3fec37953c..5879576bcf 100644 --- a/cpukit/score/include/rtems/score/threadq.h +++ b/cpukit/score/include/rtems/score/threadq.h @@ -1,14 +1,14 @@ /** - * @file rtems/score/threadq.h + * @file * - * Constants and Structures Associated with the Manipulation of Objects + * @brief Constants and Structures Needed to Declare a Thread Queue * - * This include file contains all the constants and structures associated - * with the manipulation of objects. + * This include file contains all the constants and structures + * needed to declare a thread queue. */ /* - * COPYRIGHT (c) 1989-2009. + * COPYRIGHT (c) 1989-2008. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -19,363 +19,77 @@ #ifndef _RTEMS_SCORE_THREADQ_H #define _RTEMS_SCORE_THREADQ_H -#include <rtems/score/tqdata.h> - -#include <rtems/score/object.h> -#include <rtems/score/thread.h> -#include <rtems/score/watchdog.h> +#include <rtems/score/chain.h> +#include <rtems/score/states.h> +#include <rtems/score/threadsync.h> #ifdef __cplusplus extern "C" { #endif /** - * @defgroup ScoreThreadQ Thread Queue Handler + * @defgroup ScoreThreadQueue Thread Queue Handler * * @ingroup Score * - * This handler encapsulates functionality related to managing sets of threads - * blocked waiting for resources. + * This handler defines the data shared between the thread and thread + * queue handlers. Having this handler define these data structure + * avoids potentially circular references. */ /**@{*/ /** - * Constant for indefinite wait. - */ -#define THREAD_QUEUE_WAIT_FOREVER WATCHDOG_NO_TIMEOUT - -/** - * The following type defines the callout used when a remote task - * is extracted from a local thread queue. - */ -typedef void ( *Thread_queue_Flush_callout )( - Thread_Control * - ); - -/** - * The following type defines the callout used for timeout processing - * methods. - */ -typedef void ( *Thread_queue_Timeout_callout )( - Objects_Id, - void * - ); - -/** - * @brief Gets a pointer to a thread waiting on the_thread_queue. - * - * This function returns a pointer to a thread waiting on - * the_thread_queue. The selection of this thread is based on - * the discipline of the_thread_queue. If no threads are waiting - * on the_thread_queue, then NULL is returned. - */ -Thread_Control *_Thread_queue_Dequeue( - Thread_queue_Control *the_thread_queue -); - -/** - * @brief Enqueues the currently executing thread on the_thread_queue. - * - * This routine enqueues the currently executing thread on - * the_thread_queue with an optional timeout. - */ -#define _Thread_queue_Enqueue( _the_thread_queue, _timeout ) \ - _Thread_queue_Enqueue_with_handler( \ - _the_thread_queue, \ - _timeout, \ - _Thread_queue_Timeout ) - -/** - * @brief Blocks a thread and places it on a thread. - * - * This routine blocks a thread, places it on a thread, and optionally - * starts a timeout timer. - * - * @param[in] the_thread_queue pointer to threadq - * @param[in] timeout interval to wait - * - * - INTERRUPT LATENCY: - * + single case - */ -void _Thread_queue_Enqueue_with_handler( - Thread_queue_Control* the_thread_queue, - Watchdog_Interval timeout, - Thread_queue_Timeout_callout handler -); - -/** - * @brief Invoked when a thread changes priority and is blocked. - * - * This routine is invoked when a thread changes priority and is - * blocked on a thread queue. If the queue is priority ordered, - * the_thread is removed from the_thread_queue and reinserted using - * its new priority. This method has no impact on the state of the_thread - * or of any timeouts associated with this blocking. - * - * @param[in] the_thread_queue pointer to a threadq header - * @param[in] the_thread pointer to a thread control block - */ -void _Thread_queue_Requeue( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread -); - -/** - * @brief Extracts thread from thread queue. - * - * This routine removes @a the_thread from @a the_thread_queue - * and cancels any timeouts associated with this blocking. - * - * @param[in] the_thread_queue is the pointer to the ThreadQ header - * @param[in] the_thread is the pointer to a thread control block that is to be removed - */ -void _Thread_queue_Extract( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread -); - -/** - * @brief Extracts the_thread from the_thread_queue. - * - * This routine extracts the_thread from the_thread_queue - * and ensures that if there is a proxy for this task on - * another node, it is also dealt with. - */ -bool _Thread_queue_Extract_with_proxy( - Thread_Control *the_thread -); - -/** - * @brief Gets a pointer to the "first" thread on the_thread_queue. - * - * This function returns a pointer to the "first" thread - * on the_thread_queue. The "first" thread is selected - * based on the discipline of the_thread_queue. - * - * @param[in] the_thread_queue pointer to thread queue - * - * @retval first thread or NULL - */ -Thread_Control *_Thread_queue_First( - Thread_queue_Control *the_thread_queue -); - -/** - * @brief Unblocks all threads blocked on the_thread_queue. - * - * This routine unblocks all threads blocked on the_thread_queue - * and cancels any associated timeouts. - * - * @param[in] the_thread_queue is the pointer to a threadq header - * @param[in] remote_extract_callout points to a method to invoke to - * invoke when a remote thread is unblocked - * @param[in] status is the status which will be returned to - * all unblocked threads - */ -void _Thread_queue_Flush( - Thread_queue_Control *the_thread_queue, - Thread_queue_Flush_callout remote_extract_callout, - uint32_t status -); - -/** - * @brief Initialize the_thread_queue. - * - * This routine initializes the_thread_queue based on the - * discipline indicated in attribute_set. The state set on - * threads which block on the_thread_queue is state. - * - * @param[in] the_thread_queue is the pointer to a threadq header - * @param[in] the_discipline is the queueing discipline - * @param[in] state is the state of waiting threads - * @param[in] timeout_status is the return on a timeout - */ -void _Thread_queue_Initialize( - Thread_queue_Control *the_thread_queue, - Thread_queue_Disciplines the_discipline, - States_Control state, - uint32_t timeout_status -); - -/** - * @brief Removes a thread from the specified PRIORITY based - * threadq, unblocks it, and cancels its timeout timer. - * - * This routine removes a thread from the specified PRIORITY based - * threadq, unblocks it, and cancels its timeout timer. - * - * - INTERRUPT LATENCY: - * + single case - * - * @param[in] the_thread_queue is a pointer to a thread queue - * - * @retval thread dequeued - * @retval NULL if no thread are waiting on the_thread_queue - */ -Thread_Control *_Thread_queue_Dequeue_priority( - Thread_queue_Control *the_thread_queue -); - -/** - * @brief Enqueues the currently executing thread on the_thread_queue. - * - * This routine enqueues the currently executing thread on - * the_thread_queue with an optional timeout using the - * priority discipline. - * - * @param[in] the_thread_queue is the pointer to threadq - * @param[in] the_thread is the thread to insert - * @param[in] level_p is a pointer to an interrupt level to be returned - * - * @retval This methods returns an indication of the blocking state as - * well as filling in *@ level_p with the previous interrupt level. - * - * - INTERRUPT LATENCY: - * + forward less than - * + forward equal - */ -Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread, - ISR_Level *level_p -); - -/** - * @brief Removes the_thread and cancels related timeouts. - * - * This routine removes the_thread from the_thread_queue - * and cancels any timeouts associated with this blocking. - * @param[in] the_thread_queue pointer to a threadq header - * @param[in] the_thread pointer to a thread control block - * @param[in] requeuing true if requeuing and should not alter - * timeout or state - * - INTERRUPT LATENCY: - * + EXTRACT_PRIORITY - */ -void _Thread_queue_Extract_priority_helper( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread, - bool requeuing -); - -/** - * @brief Wraps the underlying call and hides the requeuing argument. - * - * This macro wraps the underlying call and hides the requeuing argument. - */ - -#define _Thread_queue_Extract_priority( _the_thread_queue, _the_thread ) \ - _Thread_queue_Extract_priority_helper( _the_thread_queue, _the_thread, false ) -/** - * @brief Get highest priority thread on the_thread_queue. - * - * This function returns a pointer to the "first" thread - * on @a the_thread_queue. The "first" thread is the highest - * priority thread waiting on @a the_thread_queue. - * - * @param[in] the_thread_queue is the pointer to the thread queue - * @retval first thread or NULL - */ -Thread_Control *_Thread_queue_First_priority( - Thread_queue_Control *the_thread_queue -); - -/** - * @brief Gets a pointer to the thread which has been waiting the longest. - * - * This function returns a pointer to the thread which has - * been waiting the longest on the_thread_queue. If no - * threads are waiting on the_thread_queue, then NULL is returned. - * - * @param[in] the_thread_queue is the pointer to threadq - * - * @retval thread dequeued or NULL - * - * - INTERRUPT LATENCY: - * + check sync - * + FIFO - */ -Thread_Control *_Thread_queue_Dequeue_fifo( - Thread_queue_Control *the_thread_queue -); - -/** - * @brief Enqueues the currently executing thread on the_thread_queue. - * - * This routine enqueues the currently executing thread on - * the_thread_queue with an optional timeout using the - * FIFO discipline. - * - * @param[in] the_thread_queue pointer to threadq - * @param[in] the_thread pointer to the thread to block - * @param[in] level_p interrupt level in case the operation blocks actually - * - * - INTERRUPT LATENCY: - * + single case - */ -Thread_blocking_operation_States _Thread_queue_Enqueue_fifo ( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread, - ISR_Level *level_p -); - -/** - * @brief Removes the_thread from the_thread_queue and cancels any timeouts. - * - * This routine removes the_thread from the_thread_queue - * and cancels any timeouts associated with this blocking. - */ -void _Thread_queue_Extract_fifo( - Thread_queue_Control *the_thread_queue, - Thread_Control *the_thread -); - -/** - * @brief Gets a pointer to the "first" thread on the_thread_queue. - * - * This function returns a pointer to the "first" thread - * on the_thread_queue. The first thread is the thread - * which has been waiting longest on the_thread_queue. - * - * @param[in] the_thread_queue is the pointer to threadq - * - * @retval first thread or NULL - */ -Thread_Control *_Thread_queue_First_fifo( - Thread_queue_Control *the_thread_queue -); - -/** - * @brief Thread queue timeout. - * - * This routine is invoked when a task's request has not - * been satisfied after the timeout interval specified to - * enqueue. The task represented by ID will be unblocked and - * its status code will be set in it's control block to indicate - * that a timeout has occurred. - * - * @param[in] id thread id - */ -void _Thread_queue_Timeout ( - Objects_Id id, - void *ignored -); - -/** - * @brief Process thread queue timeout. - * - * This is a shared helper routine which makes it easier to have multiple - * object class specific timeout routines. - * - * @param[in] the_thread is the thread to extract - * - * @note This method assumes thread dispatching is disabled - * and is expected to be called via the processing of - * a clock tick. - */ -void _Thread_queue_Process_timeout( - Thread_Control *the_thread -); + * The following enumerated type details all of the disciplines + * supported by the Thread Queue Handler. + */ +typedef enum { + THREAD_QUEUE_DISCIPLINE_FIFO, /* FIFO queue discipline */ + THREAD_QUEUE_DISCIPLINE_PRIORITY /* PRIORITY queue discipline */ +} Thread_queue_Disciplines; + +/** + * This is one of the constants used to manage the priority queues. + * + * There are four chains used to maintain a priority -- each chain + * manages a distinct set of task priorities. The number of chains + * is determined by TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS. + * The following set must be consistent. + * + * The set below configures 4 headers -- each contains 64 priorities. + * Header x manages priority range (x*64) through ((x*64)+63). If + * the priority is more than half way through the priority range it + * is in, then the search is performed from the rear of the chain. + * This halves the search time to find the insertion point. + */ +#define TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS 4 + +/** + * This is the structure used to manage sets of tasks which are blocked + * waiting to acquire a resource. + */ +typedef struct { + /** This union contains the data structures used to manage the blocked + * set of tasks which varies based upon the discipline. + */ + union { + /** This is the FIFO discipline list. */ + Chain_Control Fifo; + /** This is the set of lists for priority discipline waiting. */ + Chain_Control Priority[TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS]; + } Queues; + /** This field is used to manage the critical section. */ + Thread_blocking_operation_States sync_state; + /** This field indicates the thread queue's blocking discipline. */ + Thread_queue_Disciplines discipline; + /** This indicates the blocking state for threads waiting on this + * thread queue. + */ + States_Control state; + /** This is the status value returned to threads which timeout while + * 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 new file mode 100644 index 0000000000..3d801c8dff --- /dev/null +++ b/cpukit/score/include/rtems/score/threadqimpl.h @@ -0,0 +1,428 @@ +/** + * @file rtems/score/threadq.h + * + * Constants and Structures Associated with the Manipulation of Objects + * + * This include file contains all the constants and structures associated + * with the manipulation of objects. + */ + +/* + * COPYRIGHT (c) 1989-2009. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifndef _RTEMS_SCORE_THREADQIMPL_H +#define _RTEMS_SCORE_THREADQIMPL_H + +#include <rtems/score/threadq.h> +#include <rtems/score/thread.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup ScoreThreadQueue + */ +/**@{*/ + +/** + * Constant for indefinite wait. + */ +#define THREAD_QUEUE_WAIT_FOREVER WATCHDOG_NO_TIMEOUT + +/** + * This is one of the constants used to manage the priority queues. + * @ref TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS for more details. + */ +#define TASK_QUEUE_DATA_PRIORITIES_PER_HEADER 64 + +/** + * This is one of the constants used to manage the priority queues. + * @ref TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS for more details. + */ +#define TASK_QUEUE_DATA_REVERSE_SEARCH_MASK 0x20 + +/** + * The following type defines the callout used when a remote task + * is extracted from a local thread queue. + */ +typedef void ( *Thread_queue_Flush_callout )( + Thread_Control * + ); + +/** + * The following type defines the callout used for timeout processing + * methods. + */ +typedef void ( *Thread_queue_Timeout_callout )( + Objects_Id, + void * + ); + +/** + * @brief Gets a pointer to a thread waiting on the_thread_queue. + * + * This function returns a pointer to a thread waiting on + * the_thread_queue. The selection of this thread is based on + * the discipline of the_thread_queue. If no threads are waiting + * on the_thread_queue, then NULL is returned. + */ +Thread_Control *_Thread_queue_Dequeue( + Thread_queue_Control *the_thread_queue +); + +/** + * @brief Enqueues the currently executing thread on the_thread_queue. + * + * This routine enqueues the currently executing thread on + * the_thread_queue with an optional timeout. + */ +#define _Thread_queue_Enqueue( _the_thread_queue, _timeout ) \ + _Thread_queue_Enqueue_with_handler( \ + _the_thread_queue, \ + _timeout, \ + _Thread_queue_Timeout ) + +/** + * @brief Blocks a thread and places it on a thread. + * + * This routine blocks a thread, places it on a thread, and optionally + * starts a timeout timer. + * + * @param[in] the_thread_queue pointer to threadq + * @param[in] timeout interval to wait + * + * - INTERRUPT LATENCY: + * + single case + */ +void _Thread_queue_Enqueue_with_handler( + Thread_queue_Control* the_thread_queue, + Watchdog_Interval timeout, + Thread_queue_Timeout_callout handler +); + +/** + * @brief Invoked when a thread changes priority and is blocked. + * + * This routine is invoked when a thread changes priority and is + * blocked on a thread queue. If the queue is priority ordered, + * the_thread is removed from the_thread_queue and reinserted using + * its new priority. This method has no impact on the state of the_thread + * or of any timeouts associated with this blocking. + * + * @param[in] the_thread_queue pointer to a threadq header + * @param[in] the_thread pointer to a thread control block + */ +void _Thread_queue_Requeue( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread +); + +/** + * @brief Extracts thread from thread queue. + * + * This routine removes @a the_thread from @a the_thread_queue + * and cancels any timeouts associated with this blocking. + * + * @param[in] the_thread_queue is the pointer to the ThreadQ header + * @param[in] the_thread is the pointer to a thread control block that is to be removed + */ +void _Thread_queue_Extract( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread +); + +/** + * @brief Extracts the_thread from the_thread_queue. + * + * This routine extracts the_thread from the_thread_queue + * and ensures that if there is a proxy for this task on + * another node, it is also dealt with. + */ +bool _Thread_queue_Extract_with_proxy( + Thread_Control *the_thread +); + +/** + * @brief Gets a pointer to the "first" thread on the_thread_queue. + * + * This function returns a pointer to the "first" thread + * on the_thread_queue. The "first" thread is selected + * based on the discipline of the_thread_queue. + * + * @param[in] the_thread_queue pointer to thread queue + * + * @retval first thread or NULL + */ +Thread_Control *_Thread_queue_First( + Thread_queue_Control *the_thread_queue +); + +/** + * @brief Unblocks all threads blocked on the_thread_queue. + * + * This routine unblocks all threads blocked on the_thread_queue + * and cancels any associated timeouts. + * + * @param[in] the_thread_queue is the pointer to a threadq header + * @param[in] remote_extract_callout points to a method to invoke to + * invoke when a remote thread is unblocked + * @param[in] status is the status which will be returned to + * all unblocked threads + */ +void _Thread_queue_Flush( + Thread_queue_Control *the_thread_queue, + Thread_queue_Flush_callout remote_extract_callout, + uint32_t status +); + +/** + * @brief Initialize the_thread_queue. + * + * This routine initializes the_thread_queue based on the + * discipline indicated in attribute_set. The state set on + * threads which block on the_thread_queue is state. + * + * @param[in] the_thread_queue is the pointer to a threadq header + * @param[in] the_discipline is the queueing discipline + * @param[in] state is the state of waiting threads + * @param[in] timeout_status is the return on a timeout + */ +void _Thread_queue_Initialize( + Thread_queue_Control *the_thread_queue, + Thread_queue_Disciplines the_discipline, + States_Control state, + uint32_t timeout_status +); + +/** + * @brief Removes a thread from the specified PRIORITY based + * threadq, unblocks it, and cancels its timeout timer. + * + * This routine removes a thread from the specified PRIORITY based + * threadq, unblocks it, and cancels its timeout timer. + * + * - INTERRUPT LATENCY: + * + single case + * + * @param[in] the_thread_queue is a pointer to a thread queue + * + * @retval thread dequeued + * @retval NULL if no thread are waiting on the_thread_queue + */ +Thread_Control *_Thread_queue_Dequeue_priority( + Thread_queue_Control *the_thread_queue +); + +/** + * @brief Enqueues the currently executing thread on the_thread_queue. + * + * This routine enqueues the currently executing thread on + * the_thread_queue with an optional timeout using the + * priority discipline. + * + * @param[in] the_thread_queue is the pointer to threadq + * @param[in] the_thread is the thread to insert + * @param[in] level_p is a pointer to an interrupt level to be returned + * + * @retval This methods returns an indication of the blocking state as + * well as filling in *@ level_p with the previous interrupt level. + * + * - INTERRUPT LATENCY: + * + forward less than + * + forward equal + */ +Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread, + ISR_Level *level_p +); + +/** + * @brief Removes the_thread and cancels related timeouts. + * + * This routine removes the_thread from the_thread_queue + * and cancels any timeouts associated with this blocking. + * @param[in] the_thread_queue pointer to a threadq header + * @param[in] the_thread pointer to a thread control block + * @param[in] requeuing true if requeuing and should not alter + * timeout or state + * - INTERRUPT LATENCY: + * + EXTRACT_PRIORITY + */ +void _Thread_queue_Extract_priority_helper( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread, + bool requeuing +); + +/** + * @brief Wraps the underlying call and hides the requeuing argument. + * + * This macro wraps the underlying call and hides the requeuing argument. + */ + +#define _Thread_queue_Extract_priority( _the_thread_queue, _the_thread ) \ + _Thread_queue_Extract_priority_helper( _the_thread_queue, _the_thread, false ) +/** + * @brief Get highest priority thread on the_thread_queue. + * + * This function returns a pointer to the "first" thread + * on @a the_thread_queue. The "first" thread is the highest + * priority thread waiting on @a the_thread_queue. + * + * @param[in] the_thread_queue is the pointer to the thread queue + * @retval first thread or NULL + */ +Thread_Control *_Thread_queue_First_priority( + Thread_queue_Control *the_thread_queue +); + +/** + * @brief Gets a pointer to the thread which has been waiting the longest. + * + * This function returns a pointer to the thread which has + * been waiting the longest on the_thread_queue. If no + * threads are waiting on the_thread_queue, then NULL is returned. + * + * @param[in] the_thread_queue is the pointer to threadq + * + * @retval thread dequeued or NULL + * + * - INTERRUPT LATENCY: + * + check sync + * + FIFO + */ +Thread_Control *_Thread_queue_Dequeue_fifo( + Thread_queue_Control *the_thread_queue +); + +/** + * @brief Enqueues the currently executing thread on the_thread_queue. + * + * This routine enqueues the currently executing thread on + * the_thread_queue with an optional timeout using the + * FIFO discipline. + * + * @param[in] the_thread_queue pointer to threadq + * @param[in] the_thread pointer to the thread to block + * @param[in] level_p interrupt level in case the operation blocks actually + * + * - INTERRUPT LATENCY: + * + single case + */ +Thread_blocking_operation_States _Thread_queue_Enqueue_fifo ( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread, + ISR_Level *level_p +); + +/** + * @brief Removes the_thread from the_thread_queue and cancels any timeouts. + * + * This routine removes the_thread from the_thread_queue + * and cancels any timeouts associated with this blocking. + */ +void _Thread_queue_Extract_fifo( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread +); + +/** + * @brief Gets a pointer to the "first" thread on the_thread_queue. + * + * This function returns a pointer to the "first" thread + * on the_thread_queue. The first thread is the thread + * which has been waiting longest on the_thread_queue. + * + * @param[in] the_thread_queue is the pointer to threadq + * + * @retval first thread or NULL + */ +Thread_Control *_Thread_queue_First_fifo( + Thread_queue_Control *the_thread_queue +); + +/** + * @brief Thread queue timeout. + * + * This routine is invoked when a task's request has not + * been satisfied after the timeout interval specified to + * enqueue. The task represented by ID will be unblocked and + * its status code will be set in it's control block to indicate + * that a timeout has occurred. + * + * @param[in] id thread id + */ +void _Thread_queue_Timeout ( + Objects_Id id, + void *ignored +); + +/** + * @brief Process thread queue timeout. + * + * This is a shared helper routine which makes it easier to have multiple + * object class specific timeout routines. + * + * @param[in] the_thread is the thread to extract + * + * @note This method assumes thread dispatching is disabled + * and is expected to be called via the processing of + * a clock tick. + */ +void _Thread_queue_Process_timeout( + Thread_Control *the_thread +); + +/** + * This function returns the index of the priority chain on which + * a thread of the_priority should be placed. + */ + +RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number ( + Priority_Control the_priority +) +{ + return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER); +} + +/** + * This function returns true if the_priority indicates that the + * enqueue search should start at the front of this priority + * group chain, and false if the search should start at the rear. + */ + +RTEMS_INLINE_ROUTINE bool _Thread_queue_Is_reverse_search ( + Priority_Control the_priority +) +{ + return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK ); +} + +/** + * This routine is invoked to indicate that the specified thread queue is + * entering a critical section. + */ + +RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( + Thread_queue_Control *the_thread_queue +) +{ + the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; +} + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/cpukit/score/include/rtems/score/tqdata.h b/cpukit/score/include/rtems/score/tqdata.h deleted file mode 100644 index c556d3ffe8..0000000000 --- a/cpukit/score/include/rtems/score/tqdata.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file rtems/score/tqdata.h - * - * @brief Constants and Structures Needed to Declare a Thread Queue - * - * This include file contains all the constants and structures - * needed to declare a thread queue. - */ - -/* - * COPYRIGHT (c) 1989-2008. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - */ - -#ifndef _RTEMS_SCORE_TQDATA_H -#define _RTEMS_SCORE_TQDATA_H - -/** - * @defgroup ScoreThreadQData Thread Queue Handler Data Definition - * - * @ingroup Score - * - * This handler defines the data shared between the thread and thread - * queue handlers. Having this handler define these data structure - * avoids potentially circular references. - */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <rtems/score/chain.h> -#include <rtems/score/priority.h> -#include <rtems/score/states.h> -#include <rtems/score/threadsync.h> - -/** - * The following enumerated type details all of the disciplines - * supported by the Thread Queue Handler. - */ -typedef enum { - THREAD_QUEUE_DISCIPLINE_FIFO, /* FIFO queue discipline */ - THREAD_QUEUE_DISCIPLINE_PRIORITY /* PRIORITY queue discipline */ -} Thread_queue_Disciplines; - -/** - * This is one of the constants used to manage the priority queues. - * - * There are four chains used to maintain a priority -- each chain - * manages a distinct set of task priorities. The number of chains - * is determined by TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS. - * The following set must be consistent. - * - * The set below configures 4 headers -- each contains 64 priorities. - * Header x manages priority range (x*64) through ((x*64)+63). If - * the priority is more than half way through the priority range it - * is in, then the search is performed from the rear of the chain. - * This halves the search time to find the insertion point. - */ -#define TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS 4 - -/** - * This is one of the constants used to manage the priority queues. - * @ref TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS for more details. - */ -#define TASK_QUEUE_DATA_PRIORITIES_PER_HEADER 64 - -/** - * This is one of the constants used to manage the priority queues. - * @ref TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS for more details. - */ -#define TASK_QUEUE_DATA_REVERSE_SEARCH_MASK 0x20 - -/** - * This is the structure used to manage sets of tasks which are blocked - * waiting to acquire a resource. - */ -typedef struct { - /** This union contains the data structures used to manage the blocked - * set of tasks which varies based upon the discipline. - */ - union { - /** This is the FIFO discipline list. */ - Chain_Control Fifo; - /** This is the set of lists for priority discipline waiting. */ - Chain_Control Priority[TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS]; - } Queues; - /** This field is used to manage the critical section. */ - Thread_blocking_operation_States sync_state; - /** This field indicates the thread queue's blocking discipline. */ - Thread_queue_Disciplines discipline; - /** This indicates the blocking state for threads waiting on this - * thread queue. - */ - States_Control state; - /** This is the status value returned to threads which timeout while - * waiting on this thread queue. - */ - uint32_t timeout_status; -} Thread_queue_Control; - -#ifndef __RTEMS_APPLICATION__ -#include <rtems/score/tqdata.inl> -#endif - -#ifdef __cplusplus -} -#endif - -/**@}*/ - -#endif -/* end of include file */ |