summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/rwlockimpl.h
blob: 2d6002ac7fc4d6d2d50e405c806eeb665c9111b4 (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
/**
 * @file
 * 
 * @brief Inlined Routines from the POSIX RWLock Manager
 *
 * This file contains the static inlin implementation of the inlined
 * routines from the POSIX RWLock 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_RWLOCKIMPL_H
#define _RTEMS_POSIX_RWLOCKIMPL_H

#include <rtems/posix/rwlock.h>
#include <rtems/score/corerwlockimpl.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_RWLock_Information;

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

void _POSIX_RWLock_Manager_initialization(void);

/**
 * @brief POSIX translate core RWLock return code.
 *
 * This routine translates SuperCore RWLock status codes into the
 * corresponding POSIX ones.
 *
 *
 * @param[in] the_RWLock_status is the SuperCore status.
 *
 * @return the corresponding POSIX status
 * @retval 0 The status indicates that the operation completed successfully.
 * @retval EINVAL The status indicates that the thread was blocked waiting for
 * an operation to complete and the RWLock was deleted.
 * @retval EBUSY This status indicates that the RWLock was not 
 * immediately available.
 * @retval ETIMEDOUT This status indicates that the calling task was 
 * willing to block but the operation was unable to complete within
 * the time allotted because the resource never became available.
 */
int _POSIX_RWLock_Translate_core_RWLock_return_code(
  CORE_RWLock_Status  the_RWLock_status
);

/**
 * @brief Allocate a RWLock control block.
 *
 * This function allocates a RWLock control block from
 * the inactive chain of free RWLock control blocks.
 */
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
  return (POSIX_RWLock_Control *) 
    _Objects_Allocate( &_POSIX_RWLock_Information );
}

/**
 * @brief Free a RWLock control block.
 *
 * This routine frees a RWLock control block to the
 * inactive chain of free RWLock control blocks.
 */
RTEMS_INLINE_ROUTINE void _POSIX_RWLock_Free (
  POSIX_RWLock_Control *the_RWLock
)
{
  _Objects_Free( &_POSIX_RWLock_Information, &the_RWLock->Object );
}

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

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

#ifdef __cplusplus
}
#endif

#endif
/*  end of include file */