summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/pthreadimpl.h
blob: 02d8bca0f5d1cb1c105426e8f952e6960558a97f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
/**
 * @file
 *
 * @brief POSIX Threads Private Support
 *
 * This include file contains all the private support information for
 * POSIX threads.
 */

/*
 *  COPYRIGHT (c) 1989-2011.
 *  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_POSIX_PTHREADIMPL_H
#define _RTEMS_POSIX_PTHREADIMPL_H

#include <rtems/posix/pthread.h>
#include <rtems/posix/config.h>
#include <rtems/posix/threadsup.h>
#include <rtems/score/objectimpl.h>
#include <rtems/score/threadimpl.h>
#include <rtems/score/assert.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @addtogroup POSIX_PTHREAD
 */
/**@{**/

/**
 * The following sets the minimum stack size for POSIX threads.
 */
#define PTHREAD_MINIMUM_STACK_SIZE (_Stack_Minimum() * 2)

/**
 * The following defines the information control block used to manage
 * this class of objects.
 */
POSIX_EXTERN Objects_Information  _POSIX_Threads_Information;

/**
 * This variable contains the default POSIX Thread attributes.
 */
extern pthread_attr_t _POSIX_Threads_Default_attributes;

/**
 * When the user configures a set of POSIX API initialization threads,
 * This variable will point to the method used to initialize them.
 *
 * NOTE: It is instantiated and initialized by confdefs.h based upon
 *       application requirements.
 */
extern void (*_POSIX_Threads_Initialize_user_threads_p)(void);

/**
 * @brief POSIX threads manager initialization.
 *
 * This routine performs the initialization necessary for this manager.
 */
void _POSIX_Threads_Manager_initialization(void);

/**
 * @brief Allocate POSIX thread control block.
 *
 * This function allocates a pthread control block from
 * the inactive chain of free pthread control blocks.
 *
 * @return This method returns a newly allocated thread.
 */
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void );

/**
 * @brief Copy POSIX Thread attribute structure.
 *
 * This routine copies the attr2 thread attribute structure
 * to the attr1 Thread Attribute structure.
 *
 * @param[in] dst_attr is a pointer to the thread attribute
 * structure to copy into.
 *
 * @param[out] src_attr is a pointer to the thread attribute
 * structure to copy from.
 */
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Copy_attributes(
  pthread_attr_t        *dst_attr,
  const pthread_attr_t  *src_attr
);

/**
 * @brief Free POSIX control block.
 *
 * This routine frees a pthread control block to the
 * inactive chain of free pthread control blocks.
 *
 * @param[in] the_pthread is a pointer to the thread to free.
 */
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free(
  Thread_Control *the_pthread
);

/**
 * @brief Map POSIX thread IDs to control blocks.
 *
 * This function maps pthread IDs to pthread control blocks.
 * If ID corresponds to a local pthread, then it returns
 * the_pthread control pointer which maps to ID and location
 * is set to OBJECTS_LOCAL.  if the pthread ID is global and
 * resides on a remote node, then location is set to OBJECTS_REMOTE,
 * and the_pthread is undefined.  Otherwise, location is set
 * to OBJECTS_ERROR and the_pthread is undefined.
 *
 * @param[in] id is the id to lookup
 * @param[in] location points to the returned location value
 *
 * @return This methods returns a pointer to the corresponding Thread_Control.
 */
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get(
  pthread_t          id,
  Objects_Locations *location
);

/**
 * @brief POSIX threads initialize user threads body.
 *
 * This routine initializes the thread attributes structure.
 */
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Initialize_attributes(
  pthread_attr_t  *attr
);

/**
 * @brief Check if a POSIX thread control block is NULL.
 *
 * This function returns @c TRUE if the_pthread is @c NULL and @c FALSE
 * otherwise.
 *
 * @param[in] the_pthread is a pointer to the POSIX thread control block
 * to check.
 *
 * @retval TRUE The thread control block is @c NULL.
 * @retval FALSE The thread control block is not @c NULL.
 */
RTEMS_INLINE_ROUTINE bool _POSIX_Threads_Is_null(
  Thread_Control *the_pthread
);

/**
 * @brief POSIX threads sporadic budget callout.
 *
 * This routine handles the sporadic scheduling algorithm.
 *
 * @param[in] the_thread is a pointer to the thread whose budget
 * has been exceeded.
 */
void _POSIX_Threads_Sporadic_budget_callout(
  Thread_Control *the_thread
);

/**
 * This routine supports the sporadic scheduling algorithm.  It
 * is scheduled to be executed at the end of each replenishment
 * period.  In sporadic scheduling a thread will execute at a
 * high priority for a user specified amount of CPU time.  When
 * it exceeds that amount of CPU time, its priority is automatically
 * lowered. This TSR is executed when it is time to replenish
 * the thread's processor budget and raise its priority.
 *
 * @param[in] id is ignored
 * @param[in] argument is a pointer to the Thread_Control structure
 *            for the thread being replenished.
 */
void _POSIX_Threads_Sporadic_budget_TSR(
  Objects_Id      id,
  void           *argument
);

/**
 * @brief Translate sched_param into SuperCore terms.
 *
 * This method translates the POSIX API sched_param into the corresponding
 * SuperCore settings.
 *
 * @param[in] policy is the POSIX scheduling policy
 * @param[in] param points to the scheduling parameter structure
 * @param[in] budget_algorithm points to the output CPU Budget algorithm
 * @param[in] budget_callout points to the output CPU Callout
 *
 * @retval 0 Indicates success.
 * @retval error_code POSIX error code indicating failure.
 */
int _POSIX_Thread_Translate_sched_param(
  int                                  policy,
  struct sched_param                  *param,
  Thread_CPU_budget_algorithms        *budget_algorithm,
  Thread_CPU_budget_algorithm_callout *budget_callout
);

/*
 * rtems_pthread_attribute_compare
 */
int rtems_pthread_attribute_compare(
  const pthread_attr_t *attr1,
  const pthread_attr_t *attr2
);

/*
 *  _POSIX_Threads_Allocate
 */

RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
  _Thread_Kill_zombies();

  return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
}

/*
 * _POSIX_Threads_Copy_attributes
 */

RTEMS_INLINE_ROUTINE void _POSIX_Threads_Copy_attributes(
  pthread_attr_t        *dst_attr,
  const pthread_attr_t  *src_attr
)
{
  *dst_attr = *src_attr;
#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
  _Assert(
    dst_attr->affinitysetsize == sizeof(dst_attr->affinitysetpreallocated)
  );
  dst_attr->affinityset = &dst_attr->affinitysetpreallocated;
#endif
}

/*
 *  _POSIX_Threads_Free
 */

RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
  Thread_Control *the_pthread
)
{
  _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
}

/*
 *  _POSIX_Threads_Get
 */

RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get (
  pthread_t          id,
  Objects_Locations *location
)
{
  return (Thread_Control *)
    _Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
}

/*
 * _POSIX_Threads_Initialize_attributes
 */

RTEMS_INLINE_ROUTINE void _POSIX_Threads_Initialize_attributes(
  pthread_attr_t  *attr
)
{
  _POSIX_Threads_Copy_attributes(
    attr,
    &_POSIX_Threads_Default_attributes
  );
}

/*
 *  _POSIX_Threads_Is_null
 */

RTEMS_INLINE_ROUTINE bool _POSIX_Threads_Is_null (
  Thread_Control *the_pthread
)
{
  return !the_pthread;
}

/** @} */

#ifdef __cplusplus
}
#endif

#endif
/*  end of include file */