diff options
Diffstat (limited to 'cpukit/include/rtems/score/thread.h')
-rw-r--r-- | cpukit/include/rtems/score/thread.h | 118 |
1 files changed, 113 insertions, 5 deletions
diff --git a/cpukit/include/rtems/score/thread.h b/cpukit/include/rtems/score/thread.h index 7e24af43c9..9bf920d5fb 100644 --- a/cpukit/include/rtems/score/thread.h +++ b/cpukit/include/rtems/score/thread.h @@ -26,6 +26,7 @@ #if defined(RTEMS_MULTIPROCESSING) #include <rtems/score/mppkt.h> #endif +#include <rtems/score/freechain.h> #include <rtems/score/isrlock.h> #include <rtems/score/objectdata.h> #include <rtems/score/priority.h> @@ -909,7 +910,7 @@ typedef struct { * * This array is provided via <rtems/confdefs.h>. * - * @see _Thread_Control_add_on_count and _Thread_Control_size. + * @see _Thread_Control_add_on_count. */ extern const Thread_Control_add_on _Thread_Control_add_ons[]; @@ -923,13 +924,11 @@ extern const Thread_Control_add_on _Thread_Control_add_ons[]; extern const size_t _Thread_Control_add_on_count; /** - * @brief Size of the thread control block of a particular application. + * @brief Count of configured threads. * * This value is provided via <rtems/confdefs.h>. - * - * @see _Thread_Control_add_ons. */ -extern const size_t _Thread_Control_size; +extern const size_t _Thread_Initial_thread_count; /** * @brief Maximum size of a thread name in characters (including the @@ -939,6 +938,115 @@ extern const size_t _Thread_Control_size; */ extern const size_t _Thread_Maximum_name_size; +/** + * @brief The configured thread control block. + * + * This type is defined in <rtems/confdefs.h> and depends on the application + * configuration. + */ +typedef struct Thread_Configured_control Thread_Configured_control; + +/** + * @brief The configured thread queue heads. + * + * In SMP configurations, this type is defined in <rtems/confdefs.h> and depends + * on the application configuration. + */ +#if defined(RTEMS_SMP) +typedef struct Thread_queue_Configured_heads Thread_queue_Configured_heads; +#else +typedef Thread_queue_Heads Thread_queue_Configured_heads; +#endif + +/** + * @brief Size of the thread queue heads of a particular application. + * + * In SMP configurations, this value is provided via <rtems/confdefs.h>. + */ +#if defined(RTEMS_SMP) +extern const size_t _Thread_queue_Heads_size; +#else +#define _Thread_queue_Heads_size sizeof(Thread_queue_Heads) +#endif + +/** + * @brief The thread object information. + */ +typedef struct { + /** + * @brief The object information. + */ + Objects_Information Objects; + + /** + * @brief Thread queue heads maintenance. + */ + union { + /** + * @brief Contains the initial set of thread queue heads. + * + * This is set by <rtems/confdefs.h> via THREAD_INFORMATION_DEFINE(). + */ + Thread_queue_Configured_heads *initial; + + /** + * @brief The free thread queue heads. + * + * This member is initialized by _Thread_Initialize_information(). + */ + Freechain_Control Free; + } Thread_queue_heads; +} Thread_Information; + +/** + * @brief The internal thread objects information. + */ +extern Thread_Information _Thread_Information; + +#define THREAD_INFORMATION_DEFINE_ZERO( name, api, cls ) \ +Thread_Information name##_Information = { \ + { \ + _Objects_Build_id( api, cls, 1, 0 ), \ + NULL, \ + 0, \ + 0, \ + 0, \ + 0, \ + CHAIN_INITIALIZER_EMPTY( name##_Information.Objects.Inactive ), \ + NULL, \ + NULL, \ + NULL \ + OBJECTS_INFORMATION_MP( name##_Information.Objects, NULL ), \ + }, { \ + NULL \ + } \ +} + +#define THREAD_INFORMATION_DEFINE( name, api, cls, max ) \ +static Objects_Control * \ +name##_Local_table[ _Objects_Maximum_per_allocation( max ) ]; \ +static Thread_Configured_control \ +name##_Objects[ _Objects_Maximum_per_allocation( max ) ]; \ +static Thread_queue_Configured_heads \ +name##_Heads[ _Objects_Maximum_per_allocation( max ) ]; \ +Thread_Information name##_Information = { \ + { \ + _Objects_Build_id( api, cls, 1, _Objects_Maximum_per_allocation( max ) ), \ + name##_Local_table, \ + 0, \ + _Objects_Is_unlimited( max ) ? _Objects_Maximum_per_allocation( max ) : 0, \ + sizeof( Thread_Configured_control ), \ + OBJECTS_NO_STRING_NAME, \ + CHAIN_INITIALIZER_EMPTY( name##_Information.Objects.Inactive ), \ + NULL, \ + NULL, \ + &name##_Objects[ 0 ].Control.Object \ + OBJECTS_INFORMATION_MP( name##_Information.Objects, NULL ) \ + }, { \ + &name##_Heads[ 0 ] \ + } \ +} + /**@}*/ #ifdef __cplusplus |