summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/threadsup.h
blob: 6bb3b844ccab906444a3f73fe58a7a91f794c782 (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
/**
 * @file
 * 
 * @brief POSIX Thread API Support
 *
 * This defines the POSIX thread API extension.
 */

/*
 *  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.com/license/LICENSE.
 */

#ifndef _RTEMS_POSIX_THREADSUP_H
#define _RTEMS_POSIX_THREADSUP_H

#include <rtems/score/coresem.h>
#include <rtems/score/thread.h>
#include <rtems/score/threadq.h>
#include <rtems/score/watchdog.h>

#include <pthread.h>
#include <signal.h>

/**
 *  @defgroup POSIX_THREAD POSIX Thread API Extension
 *
 *  @ingroup POSIXAPI
 * 
 */
/**@{**/
#ifdef __cplusplus
extern "C" {
#endif

/**
 * This defines the POSIX API support structure associated with
 * each thread in a system with POSIX configured.
 */
typedef struct {
  /** This is the POSIX threads attribute set. */
  pthread_attr_t          Attributes;
  /** This indicates whether the thread is attached or detached. */
  int                     detachstate;
  /** This is the set of threads waiting for the thread to exit. */
  Thread_queue_Control    Join_List;
  /** This is the thread's current scheduling policy. */
  int                     schedpolicy;
  /** This is the thread's current set of scheduling parameters. */
  struct sched_param      schedparam;
  /**
   * This is the high priority to execute at when using the sporadic
   * scheduler.
   */
  int                     ss_high_priority;
  /**
   * This is the timer which controls when the thread executes at
   * high and low priority when using the sporadic scheduler.
   */
  Watchdog_Control        Sporadic_timer;

  /** This is the set of signals which are currently blocked. */
  sigset_t                signals_blocked;
  /** This is the set of signals which are currently pending. */
  sigset_t                signals_pending;

  /*******************************************************************/
  /*******************************************************************/
  /***************         POSIX Cancelability         ***************/
  /*******************************************************************/
  /*******************************************************************/

  /** This is the cancelability state. */
  int                     cancelability_state;
  /** This is the cancelability type. */
  int                     cancelability_type;
  /** This indicates if a cancelation has been requested. */
  int                     cancelation_requested;
#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT
  /** This is the set of cancelation handlers. */
  Chain_Control           Cancellation_Handlers;
#else /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */
  /**
   * @brief LIFO list of cleanup contexts.
   */
  struct _pthread_cleanup_context *last_cleanup_context;
#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */

  /**
   * This is the thread key value chain's control, which is used
   * to track all key value for specific thread, and when thread
   * exits, we can remove all key value for specific thread by
   * iterating this chain, or we have to search a whole rbtree,
   * which is inefficient.
   */
  Chain_Control           Key_Chain;

} POSIX_API_Control;

/**
 * @brief POSIX thread exit shared helper.
 *
 * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150
 *
 * This method is a helper routine which ensures that all
 * POSIX thread calls which result in a thread exiting will
 * do so in the same manner.
 *
 * @param[in] the_thread is a pointer to the thread exiting or being canceled
 * @param[in] value_ptr is a pointer the value to be returned by the thread
 *
 * NOTE: Key destructors are executed in the POSIX api delete extension.
 *
 */
void _POSIX_Thread_Exit(
  Thread_Control *the_thread,
  void           *value_ptr
);

/** @} */

#ifdef __cplusplus
}
#endif

#endif
/* end of include file */