blob: 8f2b1387090260b82d86f45c1bca17f735d8b96a (
plain) (
tree)
|
|
/**
* @file
*
* @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-2014.
* 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.org/license/LICENSE.
*/
#ifndef _RTEMS_SCORE_THREADQ_H
#define _RTEMS_SCORE_THREADQ_H
#include <rtems/score/chain.h>
#include <rtems/score/isrlock.h>
#include <rtems/score/priority.h>
#include <rtems/score/rbtree.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup ScoreThreadQueue Thread Queue Handler
*
* @ingroup Score
*
* This handler provides the capability to have threads block in
* ordered sets. The sets may be ordered using the FIFO or priority
* discipline.
*/
/**@{*/
typedef struct _Thread_Control Thread_Control;
/**
* @brief Thread queue heads.
*
* Uses a leading underscore in the structure name to allow forward
* declarations in standard header files provided by Newlib and GCC.
*/
typedef struct _Thread_queue_Heads {
/** 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 threads for priority discipline waiting. */
RBTree_Control Priority;
} Heads;
Chain_Control Free_chain;
Chain_Node Free_node;
} Thread_queue_Heads;
typedef struct {
Thread_queue_Heads *heads;
/**
* @brief Lock to protect this thread queue.
*
* It may be used to protect additional state of the object embedding this
* thread queue.
*
* @see _Thread_queue_Acquire(), _Thread_queue_Acquire_critical() and
* _Thread_queue_Release().
*/
#if defined(RTEMS_SMP)
SMP_ticket_lock_Control Lock;
#endif
} Thread_queue_Queue;
/**
* @brief Thread queue priority change operation.
*
* @param[in] the_thread The thread.
* @param[in] new_priority The new priority value.
* @param[in] queue The actual thread queue.
*
* @see Thread_queue_Operations.
*/
typedef void ( *Thread_queue_Priority_change_operation )(
Thread_Control *the_thread,
Priority_Control new_priority,
Thread_queue_Queue *queue
);
/**
* @brief Thread queue enqueue operation.
*
* @param[in] queue The actual thread queue.
* @param[in] the_thread The thread to enqueue on the queue.
*
* @see _Thread_Wait_set_operations().
*/
typedef void ( *Thread_queue_Enqueue_operation )(
Thread_queue_Queue *queue,
Thread_Control *the_thread
);
/**
* @brief Thread queue extract operation.
*
* @param[in] queue The actual thread queue.
* @param[in] the_thread The thread to extract from the thread queue.
*
* @see _Thread_Wait_set_operations().
*/
typedef void ( *Thread_queue_Extract_operation )(
Thread_queue_Queue *queue,
Thread_Control *the_thread
);
/**
* @brief Thread queue first operation.
*
* @param[in] heads The thread queue heads.
*
* @retval NULL No thread is present on the thread queue.
* @retval first The first thread of the thread queue according to the insert
* order. This thread remains on the thread queue.
*
* @see _Thread_Wait_set_operations().
*/
typedef Thread_Control *( *Thread_queue_First_operation )(
Thread_queue_Heads *heads
);
/**
* @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;
/**
* @brief Thread queue enqueue operation.
*
* Called by object routines to enqueue the thread.
*/
Thread_queue_Enqueue_operation enqueue;
/**
* @brief Thread queue extract operation.
*
* Called by object routines to extract a thread from a thread queue.
*/
Thread_queue_Extract_operation extract;
/**
* @brief Thread queue first operation.
*/
Thread_queue_First_operation first;
} Thread_queue_Operations;
/**
* 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 the structure used to manage sets of tasks which are blocked
* waiting to acquire a resource.
*/
typedef struct {
/**
* @brief The actual thread queue.
*/
Thread_queue_Queue Queue;
#if defined(RTEMS_SMP) && defined(RTEMS_PROFILING)
SMP_lock_Stats Lock_stats;
#endif
/**
* @brief The operations for the actual thread queue.
*/
const Thread_queue_Operations *operations;
} Thread_queue_Control;
/**@}*/
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */
|