RTEMS  5.1
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
31 #include <rtems/score/freechain.h>
32 #include <rtems/score/isrlock.h>
33 #include <rtems/score/objectdata.h>
34 #include <rtems/score/priority.h>
36 #include <rtems/score/stack.h>
37 #include <rtems/score/states.h>
38 #include <rtems/score/threadq.h>
39 #include <rtems/score/timestamp.h>
40 #include <rtems/score/watchdog.h>
41 
42 #if defined(RTEMS_SMP)
44 #endif
45 
46 struct rtems_user_env_t;
47 
48 struct _pthread_cleanup_context;
49 
50 struct Per_CPU_Control;
51 
52 struct _Scheduler_Control;
53 
55 
56 #ifdef __cplusplus
57 extern "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  */
96 typedef void *Thread RTEMS_DEPRECATED;
97 
108 
112 typedef struct {
113  void *( *entry )( uintptr_t argument );
115 
119 typedef struct {
120  void ( *entry )( Thread_Entry_numeric_type argument );
121  Thread_Entry_numeric_type argument;
123 
128 typedef struct {
129  void *( *entry )( void *argument );
130  void *argument;
132 
136 typedef struct {
144  void ( *adaptor )( Thread_Control *executing );
145 
150  union {
151  Thread_Entry_idle Idle;
152  Thread_Entry_numeric Numeric;
153  Thread_Entry_pointer Pointer;
154  } Kinds;
156 
164 typedef 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 
184 typedef struct {
187  /*-------------- initial execution modes ----------------- */
199  uint32_t isr_level;
209  #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
210 
212  #endif
213 
214  void *tls_area;
216 
217 #if defined(RTEMS_SMP)
218 
221 typedef enum {
227  THREAD_SCHEDULER_BLOCKED,
228 
236  THREAD_SCHEDULER_SCHEDULED,
237 
243  THREAD_SCHEDULER_READY
244 } Thread_Scheduler_state;
245 #endif
246 
250 typedef struct {
251 #if defined(RTEMS_SMP)
252 
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 
371 typedef union {
372  void *mutable_object;
373  const void *immutable_object;
375 
390 typedef unsigned int Thread_Wait_flags;
391 
398 typedef 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
406 
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)
433 
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 
506 typedef struct {
507  ISR_LOCK_MEMBER( Lock )
508  Watchdog_Header *header;
509  Watchdog_Control Watchdog;
511 
519 typedef struct {
522 
527 
530 
535 
536 #if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT)
537 
538  uint32_t resource_count;
539 #endif
540 
545 
550 #if defined(RTEMS_MULTIPROCESSING)
551 
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 
589 typedef enum {
594 } Thread_APIs;
595 
597 #define THREAD_API_FIRST THREAD_API_RTEMS
598 
600 #define THREAD_API_LAST THREAD_API_POSIX
601 
602 typedef struct Thread_Action Thread_Action;
603 
620 typedef 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 
648 typedef struct {
652  RBTree_Control Key_value_pairs;
653 
657  ISR_LOCK_MEMBER( Lock )
659 
665 typedef struct {
666  Chain_Control Chain;
668 
679 typedef 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 
690 typedef struct {
696 
701 
706 
715  void *exit_value;
717 
718 typedef struct {
719  uint32_t flags;
720  void * control;
722 
735 
754 
757 
762 
763 #if defined(RTEMS_SCORE_THREAD_ENABLE_RESOURCE_COUNT)
764 
765  uint32_t resource_count;
766 #endif
767 
772 
777 #if defined(RTEMS_MULTIPROCESSING)
778 
779  MP_packet_Prefix *receive_packet;
780 #endif
781  /*================= end of common block =================*/
782 
783 #if defined(RTEMS_SMP) && defined(RTEMS_PROFILING)
784 
792  SMP_lock_Stats Potpourri_stats;
793 #endif
794 
796  bool is_idle;
797 #if defined(RTEMS_MULTIPROCESSING)
798 
799  bool is_global;
800 #endif
801 
804  bool is_fp;
805 
811 
816  uint32_t cpu_time_budget;
828 
833 
834  Thread_Action_control Post_switch_actions;
835 
838 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
839 
843 #endif
844 
845  struct _reent *libc_reent;
848 
853 
860 
861  Thread_Capture_control Capture;
862 
867 
871  struct _pthread_cleanup_context *last_cleanup_context;
872 
877 
883  void *extensions[ RTEMS_ZERO_LENGTH_ARRAY ];
884 };
885 
886 typedef void (*rtems_per_thread_routine)( Thread_Control * );
887 
894  rtems_per_thread_routine routine
895 ) RTEMS_DEPRECATED;
896 
900 typedef struct {
907 
914 
929 
937 extern const size_t _Thread_Control_add_on_count;
938 
944 extern const size_t _Thread_Initial_thread_count;
945 
953 #define THREAD_DEFAULT_MAXIMUM_NAME_SIZE 16
954 
961 extern const size_t _Thread_Maximum_name_size;
962 
970 
977 #if defined(RTEMS_SMP)
979 #else
981 #endif
982 
988 #if defined(RTEMS_SMP)
989 extern const size_t _Thread_queue_Heads_size;
990 #else
991 #define _Thread_queue_Heads_size sizeof(Thread_queue_Heads)
992 #endif
993 
997 typedef struct {
1002 
1006  union {
1013 
1020  } Thread_queue_heads;
1022 
1027 
1028 #define THREAD_INFORMATION_DEFINE_ZERO( name, api, cls ) \
1029 Thread_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 ) \
1058 static Objects_Control * \
1059 name##_Local_table[ _Objects_Maximum_per_allocation( max ) ]; \
1060 static Thread_Configured_control \
1061 name##_Objects[ _Objects_Maximum_per_allocation( max ) ]; \
1062 static Thread_queue_Configured_heads \
1063 name##_Heads[ _Objects_Maximum_per_allocation( max ) ]; \
1064 Thread_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 
1091 extern char _Thread_Idle_stacks[];
1092 
1093 #if defined(RTEMS_MULTIPROCESSING)
1094 
1100 typedef struct Thread_Configured_proxy_control Thread_Configured_proxy_control;
1101 
1107 extern 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 */
Objects_Control * _Thread_Allocate_unlimited(Objects_Information *information)
Return an inactive thread object or NULL.
Definition: threadallocateunlimited.c:66
Context_Control_fp * fp_context
Definition: thread.h:211
Definition: chain.h:68
Definition: mppkt.h:85
Timestamp_Control cpu_time_used
Definition: thread.h:827
Thread_Life_state state
The current thread life state.
Definition: thread.h:700
Definition: thread.h:184
const Thread_queue_Operations * operations
The current thread queue operations.
Definition: thread.h:498
int64_t Timestamp_Control
Definition: timestamp.h:57
Thread_CPU_budget_algorithm_callout budget_callout
Definition: thread.h:823
Thread_Wait_information Wait
Definition: thread.h:547
Information About the Thread Stack Handler.
Definition: objectdata.h:39
Information About Each Thread's Context.
uint64_t Priority_Control
The thread priority control.
Definition: priority.h:70
Data for thread entry with one pointer argument and a pointer return value.
Definition: thread.h:128
bool is_preemptible
Definition: thread.h:802
Thread_Life_state
Thread life states.
Definition: thread.h:679
Thread_Wait_information Wait
Definition: thread.h:774
The priority node to build up a priority aggregation.
Definition: priority.h:98
Data for idle thread entry.
Definition: thread.h:112
Thread entry information.
Definition: thread.h:136
Thread register context.
Definition: cpu.h:194
Union type to hold a pointer to an immutable or a mutable object.
Definition: thread.h:371
uint32_t pending_life_change_requests
The count of pending life change requests.
Definition: thread.h:705
Definition: thread.h:718
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) RTEMS_DEPRECATED
Deprecated, use rtems_task_iterate() instead.
Definition: iterateoverthreads.c:36
Thread_Start_information Start
Definition: thread.h:832
Definition: thread.h:593
Thread_queue_Control Join_queue
Definition: thread.h:526
The control block used to manage each watchdog timer.
Definition: watchdog.h:90
Definition: chain.h:86
Per-thread information for POSIX Keys.
Definition: thread.h:648
void * return_argument
Definition: thread.h:409
uint32_t return_code
Definition: thread.h:420
size_t destination_offset
Offset of the pointer field in Thread_Control referencing an application configuration dependent memo...
Definition: thread.h:906
Helpers for Manipulating Timestamps.
Thread Execution State Information.
Thread_Entry_information Entry
Definition: thread.h:186
Thread_Keys_information Keys
The POSIX Keys information.
Definition: thread.h:852
Atomic Operations API.
Chain iterator for dynamic user extensions.
Definition: userextimpl.h:46
Definition: threadq.h:552
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_Scheduler_control Scheduler
Scheduler related control.
Definition: thread.h:771
Information required to manage a thread timer.
Definition: thread.h:506
void * tls_area
Definition: thread.h:214
Thread_queue_Queue * queue
The current thread queue.
Definition: thread.h:489
struct _pthread_cleanup_context * last_cleanup_context
LIFO list of POSIX cleanup contexts.
Definition: thread.h:871
Thread_Timer_information Timer
Definition: thread.h:549
Objects_Information Objects
The object information.
Definition: thread.h:1001
Red-black tree node.
Definition: rbtree.h:55
Constants and Structures Needed to Declare a Thread Queue.
Context_Control_fp * fp_context
Definition: thread.h:842
Definition: threadq.h:402
ISR lock control.
Definition: isrlock.h:56
#define _Thread_queue_Heads_size
Size of the thread queue heads of a particular application.
Definition: thread.h:991
bool is_fp
Definition: thread.h:804
struct User_extensions_Iterator * last_user_extensions_iterator
LIFO list of user extensions iterators.
Definition: thread.h:876
Information required to manage a thread while it is blocked.
Definition: thread.h:398
uint32_t States_Control
Definition: states.h:46
const size_t _Thread_Control_add_on_count
Thread control add-on count.
const Thread_Control_add_on _Thread_Control_add_ons[]
Thread control add-ons.
Thread queue operations.
Definition: threadq.h:517
Object Handler Data Structures.
struct _reent * libc_reent
Definition: thread.h:845
struct rtems_user_env_t * user_environment
Pointer to an optional thread-specific POSIX user environment.
Definition: thread.h:866
bool was_created_with_inherited_scheduler
True, if the thread was created with an inherited scheduler (PTHREAD_INHERIT_SCHED),...
Definition: thread.h:810
Thread queue heads.
Definition: threadq.h:360
Thread_APIs
Definition: thread.h:589
User environment.
Definition: userenv.h:61
size_t source_offset
Offset relative to the thread control block begin to an application configuration dependent memory ar...
Definition: thread.h:912
Thread_CPU_budget_algorithms budget_algorithm
Definition: thread.h:821
Definition: thread.h:732
#define THREAD_API_LAST
Definition: thread.h:600
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 * allocated_stack
This field is a pointer to the allocated stack area, otherwise it is NULL.
Definition: thread.h:206
#define ISR_LOCK_MEMBER(_designator)
Defines an ISR lock member.
Definition: isrlock.h:89
Control block to manage thread actions.
Definition: thread.h:665
Per CPU Core Structure.
Definition: percpu.h:347
bool is_preemptible
Definition: thread.h:191
Thread control add-on.
Definition: thread.h:900
The thread object information.
Definition: thread.h:997
Thread action.
Definition: thread.h:640
Objects_Control Object
Definition: thread.h:734
Specification for the Packet Handler.
States_Control current_state
Definition: thread.h:756
RBTree_Control Key_value_pairs
Key value pairs registered for this thread.
Definition: thread.h:652
Priority Handler API.
The information structure used to manage each API class of objects.
Definition: objectdata.h:176
uint32_t isr_level
Definition: thread.h:199
Constants and Structures Associated with Watchdog Timers.
SPARC basic context.
Definition: cpu.h:194
Thread_CPU_budget_algorithms
Definition: thread.h:164
Definition: intercom.c:74
void * exit_value
The thread exit value.
Definition: thread.h:715
Priority_Control initial_priority
Definition: thread.h:201
Thread_CPU_budget_algorithm_callout budget_callout
Definition: thread.h:197
Freechain_Control Free
The free thread queue heads.
Definition: thread.h:1019
void * API_Extensions[THREAD_API_LAST+1]
Definition: thread.h:847
Stack_Control Initial_stack
Definition: thread.h:208
Thread_queue_Configured_heads * initial
Contains the initial set of thread queue heads.
Definition: thread.h:1012
States_Control current_state
Definition: thread.h:529
uint32_t count
Definition: thread.h:407
Data for thread entry with one numeric argument and no return value.
Definition: thread.h:119
The watchdog header to manage scheduled watchdogs.
Definition: watchdog.h:71
Thread scheduler control.
Definition: thread.h:250
Freechain Handler API.
void(* Thread_CPU_budget_algorithm_callout)(Thread_Control *)
Definition: thread.h:178
Priority_Node Real_priority
The base priority of this thread in its home scheduler instance.
Definition: thread.h:534
Thread_queue_Control Join_queue
Thread queue for thread join operations and multi-purpose lock.
Definition: thread.h:753
Scheduler control.
Definition: scheduler.h:269
Scheduler node for per-thread data.
Definition: schedulernode.h:79
Definition: thread.h:591
void * extensions[RTEMS_ZERO_LENGTH_ARRAY]
Variable length array of user extension pointers.
Definition: thread.h:883
Thread_Wait_information_Object_argument_type return_argument_second
Definition: thread.h:412
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
Definition: thread.h:519
Processor Mask API.
uint32_t Objects_Id
Definition: object.h:80
Definition: stack.h:53
Objects_Control Object
Definition: thread.h:521
uintptr_t CPU_Uint32ptr
Definition: cpu.h:662
Handles Scheduler Nodes.
Thread_CPU_budget_algorithms budget_algorithm
Definition: thread.h:193
Scheduler_Node * nodes
The scheduler nodes of this thread.
Definition: thread.h:358
Thread life control.
Definition: thread.h:690
Local ISR lock context for acquire and release pairs.
Definition: isrlock.h:65
Definition: mmu-config.c:40
Thread_queue_Heads Thread_queue_Configured_heads
The configured thread queue heads.
Definition: thread.h:980
Thread_Action Action
Thread life action used to react upon thread restart and delete requests.
Definition: thread.h:695
Context_Control Registers
Definition: thread.h:837
Thread_Information _Thread_Information
The internal thread objects information.
Thread_Life_control Life
Thread life-cycle control.
Definition: thread.h:859
Priority_Node Real_priority
The base priority of this thread in its home scheduler instance.
Definition: thread.h:761
void(* Thread_Action_handler)(Thread_Control *the_thread, Thread_Action *action, ISR_lock_Context *lock_context)
Thread action handler.
Definition: thread.h:620
ISR Locks.
char _Thread_Idle_stacks[]
The idle thread stacks.
Thread_Scheduler_control Scheduler
Scheduler related control.
Definition: thread.h:544
uint32_t option
Definition: thread.h:414
struct Thread_Configured_control Thread_Configured_control
The configured thread control block.
Definition: thread.h:969
uint32_t cpu_time_budget
Definition: thread.h:816
const size_t _Thread_Initial_thread_count
Count of configured threads.
Thread_Timer_information Timer
Definition: thread.h:776
The freechain control.
Definition: freechain.h:48
const size_t _Thread_Maximum_name_size
Maximum size of a thread name in characters (including the terminating '\0' character).
bool is_idle
Definition: thread.h:796