summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/include/rtems/rtems/barrier.h
blob: 5bcb32e04e58462003badc1e1bb5520a17476dcc (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
/**
 * @file rtems/rtems/barrier.h
 *
 *  This include file contains all the constants and structures associated
 *  with the Barrier Manager.
 *
 *  Directives provided are:
 *
 *    - create a barrier
 *    - get an ID of a barrier
 *    - delete a barrier
 *    - wait for a barrier
 *    - signal a barrier
 */

/*  COPYRIGHT (c) 1989-2008.
 *  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.
 *
 *  $Id$
 */

#ifndef _RTEMS_RTEMS_BARRIER_H
#define _RTEMS_RTEMS_BARRIER_H

/**
 *  @defgroup ClassicBarrier Barriers
 *
 *  @ingroup ClassicRTEMS
 *
 *  This encapsulates functionality which XXX
 */
/**@{*/

/**
 *  This constant is defined to extern most of the time when using
 *  this header file.  However by defining it to nothing, the data
 *  declared in this header file can be instantiated.  This is done
 *  in a single per manager file.
 */
#ifndef RTEMS_BARRIER_EXTERN
#define RTEMS_BARRIER_EXTERN extern
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include <rtems/rtems/types.h>
#include <rtems/rtems/support.h>
#include <rtems/rtems/attr.h>
#include <rtems/rtems/status.h>
#include <rtems/score/object.h>
#include <rtems/score/corebarrier.h>

/**
 *  This type defines the control block used to manage each barrier.
 */
typedef struct {
  /** This is used to manage a barrier as an object. */
  Objects_Control          Object;
  /** This is used to specify the attributes of a barrier. */
  rtems_attribute          attribute_set;
  /** This is used to implement the barrier. */
  CORE_barrier_Control     Barrier;
}   Barrier_Control;

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

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

/**
 *  @brief rtems_barrier_create
 *
 *  This routine implements the rtems_barrier_create directive.  The
 *  barrier will have the name name.  The starting count for
 *  the barrier is count.  The attribute_set determines if
 *  the barrier is global or local and the thread queue
 *  discipline.  It returns the id of the created barrier in ID.
 *
 *  @param[in] name is the name of this barrier instance.
 *  @param[in] attribute_set specifies the attributes of this barrier instance.
 *  @param[in] maximum_waiters is the maximum number of threads which will
 *             be allowed to concurrently wait at the barrier.
 *  @param[out] id will contain the id of this barrier.
 *
 *  @return a status code indicating success or the reason for failure.
 */
rtems_status_code rtems_barrier_create(
  rtems_name           name,
  rtems_attribute      attribute_set,
  uint32_t             maximum_waiters,
  rtems_id            *id
);

/**
 *  @brief rtems_barrier_ident
 *
 *  This routine implements the rtems_barrier_ident directive.
 *  This directive returns the barrier ID associated with name.
 *  If more than one barrier is named name, then the barrier
 *  to which the ID belongs is arbitrary.  node indicates the
 *  extent of the search for the ID of the barrier named name.
 *  The search can be limited to a particular node or allowed to
 *  encompass all nodes.
 *
 *  @param[in] name is the name of this barrier instance.
 *  @param[out] id will contain the id of this barrier.
 *
 *  @return a status code indicating success or the reason for failure.
 */
rtems_status_code rtems_barrier_ident(
  rtems_name    name,
  rtems_id     *id
);

/**
 *  @brief rtems_barrier_delete
 *
 *  This routine implements the rtems_barrier_delete directive.  The
 *  barrier indicated by @a id is deleted.
 *
 *  @param[in] id indicates the barrier to delete
 *
 *  @return a status code indicating success or the reason for failure.
 */
rtems_status_code rtems_barrier_delete(
  rtems_id   id
);

/**
 *  @brief rtems_barrier_wait
 *
 *  This routine implements the rtems_barrier_wait directive.  It
 *  attempts to wait at the barrier associated with @a id.  The calling task
 *  may block waiting for the barrier with an optional timeout of @a timeout
 *  clock ticks.
 *
 *  @param[in] id indicates the barrier to wait at.
 *  @param[in] timeout is the maximum length of time in ticks the calling
 *             thread is willing to block.
 *
 *  @return a status code indicating success or the reason for failure.
 */
rtems_status_code rtems_barrier_wait(
  rtems_id       id,
  rtems_interval timeout
);

/**
 *  @brief rtems_barrier_release
 *
 *  This routine implements the rtems_barrier_release directive.  It
 *  unblocks all of the threads waiting on the barrier associated with
 *  @a id.  The number of threads unblocked is returned in @a released.
 *
 *
 *  @param[in] id indicates the barrier to wait at.
 *  @param[out] released will contain the number of threads unblocked.
 *
 *  @return a status code indicating success or the reason for failure.
 */
rtems_status_code rtems_barrier_release(
  rtems_id  id,
  uint32_t *released
);

/**
 *  @brief Translate SuperCore Barrier Status Code to RTEMS Status Code
 *
 *  This function returns a RTEMS status code based on the barrier
 *  status code specified.
 *
 *  @param[in] the_status is the SuperCore Barrier status to translate.
 *
 *  @return a status code indicating success or the reason for failure.
 */
rtems_status_code _Barrier_Translate_core_barrier_return_code (
  CORE_barrier_Status  the_status
);

#ifndef __RTEMS_APPLICATION__
#include <rtems/rtems/barrier.inl>
#endif

#ifdef __cplusplus
}
#endif

/**@}*/

#endif
/*  end of include file */