summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/barrierimpl.h
blob: af220b9b19de2621209bb96ecf64bb0b8e546e88 (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
/**
 * @file
 * 
 * @brief Inlined Routines from the POSIX Barrier Manager
 *
 * This file contains the static inlin implementation of the inlined
 * routines from the POSIX Barrier Manager.
 */

/*
 *  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_BARRIERIMPL_H
#define _RTEMS_POSIX_BARRIERIMPL_H

#include <rtems/posix/barrier.h>
#include <rtems/score/corebarrierimpl.h>
#include <rtems/score/objectimpl.h>

#include <pthread.h>

#ifdef __cplusplus
extern "C" {
#endif

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

POSIX_EXTERN Objects_Information  _POSIX_Barrier_Information;

/**
 * @brief POSIX barrier manager initialization.
 *
 * This routine performs the initialization necessary for this manager.
 */

void _POSIX_Barrier_Manager_initialization(void);

/**
 * @brief POSIX translate barrier return code.
 * 
 * This routine translates SuperCore Barrier status codes into the
 * corresponding POSIX ones.
 *
 * @param[in] the_barrier_status is the SuperCore status.
 *
 * @return the corresponding POSIX status
 */
int _POSIX_Barrier_Translate_core_barrier_return_code(
  CORE_barrier_Status  the_barrier_status
);

/**
 * @brief Allocate a barrier control block.
 *
 * This function allocates a barrier control block from
 * the inactive chain of free barrier control blocks.
 */
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
  return (POSIX_Barrier_Control *) 
    _Objects_Allocate( &_POSIX_Barrier_Information );
}

/**
 * @brief Free a barrier control block.
 *
 * This routine frees a barrier control block to the
 * inactive chain of free barrier control blocks.
 */
RTEMS_INLINE_ROUTINE void _POSIX_Barrier_Free (
  POSIX_Barrier_Control *the_barrier
)
{
  _Objects_Free( &_POSIX_Barrier_Information, &the_barrier->Object );
}

/**
 * @brief Get a barrier control block.
 *
 * This function maps barrier IDs to barrier control blocks.
 * If ID corresponds to a local barrier, then it returns
 * the_barrier control pointer which maps to ID and location
 * is set to OBJECTS_LOCAL.  if the barrier ID is global and
 * resides on a remote node, then location is set to OBJECTS_REMOTE,
 * and the_barrier is undefined.  Otherwise, location is set
 * to OBJECTS_ERROR and the_barrier is undefined.
 */
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Get (
  pthread_barrier_t *barrier,
  Objects_Locations *location
)
{
  return (POSIX_Barrier_Control *) _Objects_Get(
      &_POSIX_Barrier_Information,
      (Objects_Id) *barrier,
      location
  );
}

/**
 * @brief Check if a barrier control block is NULL.
 *
 * This function returns @c TRUE if the_barrier is @c NULL and @c FALSE
 * otherwise.
 * 
 * @param[in] the_barrier is the pointer to the barrier control block
 * to be checked.
 * 
 * @retval TRUE The barrier control block is @c NULL.
 * @retval FALSE The barrier control block is not @c NULL.
 */
RTEMS_INLINE_ROUTINE bool _POSIX_Barrier_Is_null (
  POSIX_Barrier_Control *the_barrier
)
{
  return ( the_barrier == NULL );
}

#ifdef __cplusplus
}
#endif

#endif
/*  end of include file */