RTEMS 5.2
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
thread.h
Go to the documentation of this file.
1
12/*
13 * COPYRIGHT (c) 1989-2014.
14 * On-Line Applications Research Corporation (OAR).
15 *
16 * Copyright (c) 2014, 2016 embedded brains GmbH.
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#ifndef _RTEMS_SCORE_THREAD_H
24#define _RTEMS_SCORE_THREAD_H
25
26#include <rtems/score/atomic.h>
27#include <rtems/score/context.h>
28#if defined(RTEMS_MULTIPROCESSING)
29#include <rtems/score/mppkt.h>
30#endif
32#include <rtems/score/isrlock.h>
36#include <rtems/score/stack.h>
37#include <rtems/score/states.h>
38#include <rtems/score/threadq.h>
41
42#if defined(RTEMS_SMP)
44#endif
45
46struct rtems_user_env_t;
47
48struct _pthread_cleanup_context;
49
50struct Per_CPU_Control;
51
53
55
56#ifdef __cplusplus
57extern "C" {
58#endif
59
80#define RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE
81
82/*
83 * With the addition of the Constant Block Scheduler (CBS),
84 * this feature is needed even when POSIX is disabled.
85 */
86#define RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT
87
88#if defined(RTEMS_DEBUG)
89#define RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT
90#endif
91
92/*
93 * Only provided for backward compatiblity to not break application
94 * configurations.
95 */
96typedef void *Thread RTEMS_DEPRECATED;
97
108
112typedef struct {
113 void *( *entry )( uintptr_t argument );
115
119typedef struct {
120 void ( *entry )( Thread_Entry_numeric_type argument );
123
128typedef struct {
129 void *( *entry )( void *argument );
130 void *argument;
132
136typedef struct {
144 void ( *adaptor )( Thread_Control *executing );
145
150 union {
152 Thread_Entry_numeric Numeric;
153 Thread_Entry_pointer Pointer;
154 } Kinds;
156
164typedef enum {
165 THREAD_CPU_BUDGET_ALGORITHM_NONE,
166 THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE,
167 #if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
168 THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE,
169 #endif
170 #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
171 THREAD_CPU_BUDGET_ALGORITHM_CALLOUT
172 #endif
174
179
184typedef struct {
187 /*-------------- initial execution modes ----------------- */
199 uint32_t isr_level;
209 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
212 #endif
214 void *tls_area;
216
217#if defined(RTEMS_SMP)
221typedef enum {
227 THREAD_SCHEDULER_BLOCKED,
228
236 THREAD_SCHEDULER_SCHEDULED,
237
243 THREAD_SCHEDULER_READY
244} Thread_Scheduler_state;
245#endif
246
250typedef struct {
251#if defined(RTEMS_SMP)
255 ISR_lock_Control Lock;
256
260 Thread_Scheduler_state state;
261
265 const struct _Scheduler_Control *home_scheduler;
266
270 const struct _Scheduler_Control *pinned_scheduler;
271
275 struct Per_CPU_Control *cpu;
276
286 Chain_Control Wait_nodes;
287
301 Chain_Control Scheduler_nodes;
302
309 Chain_Node Help_node;
310
316 size_t helping_nodes;
317
323 Scheduler_Node *requests;
324
345 int pin_level;
346
350 Processor_mask Affinity;
351#endif
352
360
371typedef union {
372 void *mutable_object;
373 const void *immutable_object;
375
390typedef unsigned int Thread_Wait_flags;
391
398typedef struct {
399#if defined(RTEMS_MULTIPROCESSING)
400 /*
401 * @brief This field is the identifier of the remote object this thread is
402 * waiting upon.
403 */
404 Objects_Id remote_id;
405#endif
407 uint32_t count;
414 uint32_t option;
420 uint32_t return_code;
421
426#if defined(RTEMS_SMP)
427 Atomic_Uint flags;
428#else
430#endif
431
432#if defined(RTEMS_SMP)
450 struct {
454 ISR_lock_Control Default;
455
460 Chain_Control Pending_requests;
461
471 Thread_queue_Gate Tranquilizer;
472 } Lock;
473
478 Thread_queue_Link Link;
479#endif
480
490
499
500 Thread_queue_Heads *spare_heads;
502
506typedef struct {
507 ISR_LOCK_MEMBER( Lock )
508 Watchdog_Header *header;
509 Watchdog_Control Watchdog;
511
519typedef struct {
522
527
530
535
536#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT)
538 uint32_t resource_count;
539#endif
540
545
550#if defined(RTEMS_MULTIPROCESSING)
552 MP_packet_Prefix *receive_packet;
553 /****************** end of common block ********************/
554
558 Thread_queue_MP_callout thread_queue_callout;
559
563 RBTree_Node Active;
564
569 Scheduler_Node Scheduler_node;
570
578 Thread_queue_Heads Thread_queue_heads[ RTEMS_ZERO_LENGTH_ARRAY ];
579#endif
581
589typedef enum {
595
597#define THREAD_API_FIRST THREAD_API_RTEMS
598
600#define THREAD_API_LAST THREAD_API_POSIX
601
602typedef struct Thread_Action Thread_Action;
603
620typedef void ( *Thread_Action_handler )(
621 Thread_Control *the_thread,
622 Thread_Action *action,
623 ISR_lock_Context *lock_context
624);
625
641 Chain_Node Node;
642 Thread_Action_handler handler;
643};
644
648typedef struct {
652 RBTree_Control Key_value_pairs;
653
657 ISR_LOCK_MEMBER( Lock )
659
665typedef struct {
666 Chain_Control Chain;
668
679typedef enum {
680 THREAD_LIFE_PROTECTED = 0x1,
681 THREAD_LIFE_RESTARTING = 0x2,
682 THREAD_LIFE_TERMINATING = 0x4,
683 THREAD_LIFE_CHANGE_DEFERRED = 0x8,
684 THREAD_LIFE_DETACHED = 0x10
686
690typedef struct {
696
701
706
717
718typedef struct {
719 uint32_t flags;
720 void * control;
722
735
754
757
762
763#if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT)
765 uint32_t resource_count;
766#endif
767
772
777#if defined(RTEMS_MULTIPROCESSING)
779 MP_packet_Prefix *receive_packet;
780#endif
781 /*================= end of common block =================*/
782
783#if defined(RTEMS_SMP) && defined(RTEMS_PROFILING)
792 SMP_lock_Stats Potpourri_stats;
793#endif
794
797#if defined(RTEMS_MULTIPROCESSING)
799 bool is_global;
800#endif
804 bool is_fp;
805
811
828
833
834 Thread_Action_control Post_switch_actions;
835
838#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
843#endif
845 struct _reent *libc_reent;
848
853
860
862
867
871 struct _pthread_cleanup_context *last_cleanup_context;
872
877
883 void *extensions[ RTEMS_ZERO_LENGTH_ARRAY ];
884};
885
886typedef void (*rtems_per_thread_routine)( Thread_Control * );
887
894 rtems_per_thread_routine routine
895) RTEMS_DEPRECATED;
896
900typedef struct {
907
914
929
937extern const size_t _Thread_Control_add_on_count;
938
944extern const size_t _Thread_Initial_thread_count;
945
953#define THREAD_DEFAULT_MAXIMUM_NAME_SIZE 16
954
961extern const size_t _Thread_Maximum_name_size;
962
970
977#if defined(RTEMS_SMP)
979#else
981#endif
982
988#if defined(RTEMS_SMP)
989extern const size_t _Thread_queue_Heads_size;
990#else
991#define _Thread_queue_Heads_size sizeof(Thread_queue_Heads)
992#endif
993
997typedef struct {
1002
1006 union {
1013
1020 } Thread_queue_heads;
1022
1027
1028#define THREAD_INFORMATION_DEFINE_ZERO( name, api, cls ) \
1029Thread_Information name##_Information = { \
1030 { \
1031 _Objects_Build_id( api, cls, 1, 0 ), \
1032 NULL, \
1033 _Objects_Allocate_none, \
1034 NULL, \
1035 0, \
1036 0, \
1037 0, \
1038 0, \
1039 CHAIN_INITIALIZER_EMPTY( name##_Information.Objects.Inactive ), \
1040 NULL, \
1041 NULL, \
1042 NULL \
1043 OBJECTS_INFORMATION_MP( name##_Information.Objects, NULL ), \
1044 }, { \
1045 NULL \
1046 } \
1047}
1048
1056
1057#define THREAD_INFORMATION_DEFINE( name, api, cls, max ) \
1058static Objects_Control * \
1059name##_Local_table[ _Objects_Maximum_per_allocation( max ) ]; \
1060static Thread_Configured_control \
1061name##_Objects[ _Objects_Maximum_per_allocation( max ) ]; \
1062static Thread_queue_Configured_heads \
1063name##_Heads[ _Objects_Maximum_per_allocation( max ) ]; \
1064Thread_Information name##_Information = { \
1065 { \
1066 _Objects_Build_id( api, cls, 1, _Objects_Maximum_per_allocation( max ) ), \
1067 name##_Local_table, \
1068 _Objects_Is_unlimited( max ) ? \
1069 _Thread_Allocate_unlimited : _Objects_Allocate_static, \
1070 _Objects_Is_unlimited( max ) ? \
1071 _Objects_Free_unlimited : _Objects_Free_static, \
1072 0, \
1073 _Objects_Is_unlimited( max ) ? _Objects_Maximum_per_allocation( max ) : 0, \
1074 sizeof( Thread_Configured_control ), \
1075 OBJECTS_NO_STRING_NAME, \
1076 CHAIN_INITIALIZER_EMPTY( name##_Information.Objects.Inactive ), \
1077 NULL, \
1078 NULL, \
1079 &name##_Objects[ 0 ].Control.Object \
1080 OBJECTS_INFORMATION_MP( name##_Information.Objects, NULL ) \
1081 }, { \
1082 &name##_Heads[ 0 ] \
1083 } \
1084}
1085
1091extern char _Thread_Idle_stacks[];
1092
1093#if defined(RTEMS_MULTIPROCESSING)
1100typedef struct Thread_Configured_proxy_control Thread_Configured_proxy_control;
1101
1107extern Thread_Configured_proxy_control * const _Thread_MP_Proxies;
1108#endif
1109
1112#ifdef __cplusplus
1113}
1114#endif
1115
1116#endif
1117/* end of include file */
Information About Each Thread's Context.
Information About the Thread Stack Handler.
Constants and Structures Associated with Watchdog Timers.
Freechain Handler API.
uintptr_t CPU_Uint32ptr
Definition: cpu.h:662
#define ISR_LOCK_MEMBER(_designator)
Defines an ISR lock member.
Definition: isrlock.h:89
uint32_t Objects_Id
Definition: object.h:80
uint64_t Priority_Control
The thread priority control.
Definition: priority.h:70
uint32_t States_Control
Definition: states.h:46
Thread_Life_state
Thread life states.
Definition: thread.h:679
const size_t _Thread_Initial_thread_count
Count of configured threads.
Thread_Information _Thread_Information
The internal thread objects information.
void(* Thread_CPU_budget_algorithm_callout)(Thread_Control *)
Definition: thread.h:178
#define _Thread_queue_Heads_size
Size of the thread queue heads of a particular application.
Definition: thread.h:991
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) RTEMS_DEPRECATED
Deprecated, use rtems_task_iterate() instead.
Definition: iterateoverthreads.c:36
const Thread_Control_add_on _Thread_Control_add_ons[]
Thread control add-ons.
const size_t _Thread_Control_add_on_count
Thread control add-on count.
unsigned int Thread_Wait_flags
This type is able to contain several flags used to control the wait class and state of a thread.
Definition: thread.h:390
void(* Thread_Action_handler)(Thread_Control *the_thread, Thread_Action *action, ISR_lock_Context *lock_context)
Thread action handler.
Definition: thread.h:620
CPU_Uint32ptr Thread_Entry_numeric_type
Type of the numeric argument of a thread entry function with at least one numeric argument.
Definition: thread.h:107
Thread_CPU_budget_algorithms
Definition: thread.h:164
Objects_Control * _Thread_Allocate_unlimited(Objects_Information *information)
Return an inactive thread object or NULL.
Definition: threadallocateunlimited.c:66
Thread_queue_Heads Thread_queue_Configured_heads
The configured thread queue heads.
Definition: thread.h:980
char _Thread_Idle_stacks[]
The idle thread stacks.
struct Thread_Configured_control Thread_Configured_control
The configured thread control block.
Definition: thread.h:969
const size_t _Thread_Maximum_name_size
Maximum size of a thread name in characters (including the terminating '\0' character).
#define THREAD_API_LAST
Definition: thread.h:600
Thread_APIs
Definition: thread.h:589
@ THREAD_API_POSIX
Definition: thread.h:593
@ THREAD_API_RTEMS
Definition: thread.h:591
int64_t Timestamp_Control
Definition: timestamp.h:57
Atomic Operations API.
ISR Locks.
Specification for the Packet Handler.
Object Handler Data Structures.
Processor Mask API.
Priority Handler API.
Handles Scheduler Nodes.
Thread Execution State Information.
Definition: chain.h:68
SPARC basic context.
Definition: cpu.h:194
Thread register context.
Definition: cpu.h:194
The freechain control.
Definition: freechain.h:48
Local ISR lock context for acquire and release pairs.
Definition: isrlock.h:65
ISR lock control.
Definition: isrlock.h:56
Definition: mppkt.h:85
Definition: objectdata.h:39
The information structure used to manage each API class of objects.
Definition: objectdata.h:176
Per CPU Core Structure.
Definition: percpu.h:347
The priority node to build up a priority aggregation.
Definition: priority.h:98
Red-black tree node.
Definition: rbtree.h:55
Scheduler node for per-thread data.
Definition: schedulernode.h:79
Definition: stack.h:53
Control block to manage thread actions.
Definition: thread.h:665
Thread action.
Definition: thread.h:640
Definition: thread.h:718
Thread control add-on.
Definition: thread.h:900
size_t source_offset
Offset relative to the thread control block begin to an application configuration dependent memory ar...
Definition: thread.h:912
size_t destination_offset
Offset of the pointer field in Thread_Control referencing an application configuration dependent memo...
Definition: thread.h:906
Data for idle thread entry.
Definition: thread.h:112
Thread entry information.
Definition: thread.h:136
Data for thread entry with one numeric argument and no return value.
Definition: thread.h:119
Data for thread entry with one pointer argument and a pointer return value.
Definition: thread.h:128
The thread object information.
Definition: thread.h:997
Freechain_Control Free
The free thread queue heads.
Definition: thread.h:1019
Objects_Information Objects
The object information.
Definition: thread.h:1001
Thread_queue_Configured_heads * initial
Contains the initial set of thread queue heads.
Definition: thread.h:1012
Per-thread information for POSIX Keys.
Definition: thread.h:648
RBTree_Control Key_value_pairs
Key value pairs registered for this thread.
Definition: thread.h:652
Thread life control.
Definition: thread.h:690
uint32_t pending_life_change_requests
The count of pending life change requests.
Definition: thread.h:705
Thread_Action Action
Thread life action used to react upon thread restart and delete requests.
Definition: thread.h:695
Thread_Life_state state
The current thread life state.
Definition: thread.h:700
void * exit_value
The thread exit value.
Definition: thread.h:715
Definition: thread.h:519
States_Control current_state
Definition: thread.h:529
Objects_Control Object
Definition: thread.h:521
Priority_Node Real_priority
The base priority of this thread in its home scheduler instance.
Definition: thread.h:534
Thread_Timer_information Timer
Definition: thread.h:549
Thread_Wait_information Wait
Definition: thread.h:547
Thread_Scheduler_control Scheduler
Scheduler related control.
Definition: thread.h:544
Thread_queue_Control Join_queue
Definition: thread.h:526
Thread scheduler control.
Definition: thread.h:250
Scheduler_Node * nodes
The scheduler nodes of this thread.
Definition: thread.h:358
Definition: thread.h:184
Stack_Control Initial_stack
Definition: thread.h:208
Thread_CPU_budget_algorithm_callout budget_callout
Definition: thread.h:197
bool is_preemptible
Definition: thread.h:191
Thread_Entry_information Entry
Definition: thread.h:186
void * tls_area
Definition: thread.h:214
uint32_t isr_level
Definition: thread.h:199
void * allocated_stack
This field is a pointer to the allocated stack area, otherwise it is NULL.
Definition: thread.h:206
Thread_CPU_budget_algorithms budget_algorithm
Definition: thread.h:193
Priority_Control initial_priority
Definition: thread.h:201
Context_Control_fp * fp_context
Definition: thread.h:211
Information required to manage a thread timer.
Definition: thread.h:506
Information required to manage a thread while it is blocked.
Definition: thread.h:398
Thread_queue_Queue * queue
The current thread queue.
Definition: thread.h:489
uint32_t count
Definition: thread.h:407
uint32_t option
Definition: thread.h:414
Thread_Wait_flags flags
This field contains several flags used to control the wait class and state of a thread in case fine-g...
Definition: thread.h:429
Thread_Wait_information_Object_argument_type return_argument_second
Definition: thread.h:412
const Thread_queue_Operations * operations
The current thread queue operations.
Definition: thread.h:498
uint32_t return_code
Definition: thread.h:420
void * return_argument
Definition: thread.h:409
Definition: threadq.h:553
Thread queue operations.
Definition: threadq.h:518
Definition: threadq.h:402
Chain iterator for dynamic user extensions.
Definition: userextimpl.h:46
The control block used to manage each watchdog timer.
Definition: watchdog.h:90
The watchdog header to manage scheduled watchdogs.
Definition: watchdog.h:71
Scheduler control.
Definition: scheduler.h:269
Definition: thread.h:732
Context_Control Registers
Definition: thread.h:837
Objects_Control Object
Definition: thread.h:734
struct User_extensions_Iterator * last_user_extensions_iterator
LIFO list of user extensions iterators.
Definition: thread.h:876
Timestamp_Control cpu_time_used
Definition: thread.h:827
Thread_Wait_information Wait
Definition: thread.h:774
Context_Control_fp * fp_context
Definition: thread.h:842
Priority_Node Real_priority
The base priority of this thread in its home scheduler instance.
Definition: thread.h:761
uint32_t cpu_time_budget
Definition: thread.h:816
Thread_Keys_information Keys
The POSIX Keys information.
Definition: thread.h:852
States_Control current_state
Definition: thread.h:756
bool is_fp
Definition: thread.h:804
Thread_Scheduler_control Scheduler
Scheduler related control.
Definition: thread.h:771
Thread_queue_Control Join_queue
Thread queue for thread join operations and multi-purpose lock.
Definition: thread.h:753
void * API_Extensions[THREAD_API_LAST+1]
Definition: thread.h:847
Thread_Timer_information Timer
Definition: thread.h:776
Thread_Life_control Life
Thread life-cycle control.
Definition: thread.h:859
bool was_created_with_inherited_scheduler
True, if the thread was created with an inherited scheduler (PTHREAD_INHERIT_SCHED),...
Definition: thread.h:810
struct _pthread_cleanup_context * last_cleanup_context
LIFO list of POSIX cleanup contexts.
Definition: thread.h:871
bool is_preemptible
Definition: thread.h:802
Thread_Start_information Start
Definition: thread.h:832
void * extensions[RTEMS_ZERO_LENGTH_ARRAY]
Variable length array of user extension pointers.
Definition: thread.h:883
bool is_idle
Definition: thread.h:796
struct rtems_user_env_t * user_environment
Pointer to an optional thread-specific POSIX user environment.
Definition: thread.h:866
struct _reent * libc_reent
Definition: thread.h:845
Thread_CPU_budget_algorithm_callout budget_callout
Definition: thread.h:823
Thread_CPU_budget_algorithms budget_algorithm
Definition: thread.h:821
Thread queue heads.
Definition: threadq.h:360
Definition: intercom.c:74
Definition: mmu-config.c:40
User environment.
Definition: userenv.h:61
Constants and Structures Needed to Declare a Thread Queue.
Helpers for Manipulating Timestamps.
Definition: chain.h:86
Union type to hold a pointer to an immutable or a mutable object.
Definition: thread.h:371