source: rtems/cpukit/posix/include/rtems/posix/semaphoreimpl.h @ c090db7

5
Last change on this file since c090db7 was c090db7, checked in by Sebastian Huber <sebastian.huber@…>, on 09/12/17 at 06:09:16

posix: Implement self-contained POSIX semaphores

For semaphore object pointer and object validation see
POSIX_SEMAPHORE_VALIDATE_OBJECT().

Destruction or close of a busy semaphore returns an error status. The
object is not flushed.

POSIX semaphores are now available in all configurations and no longer
depend on --enable-posix.

Update #2514.
Update #3116.

  • Property mode set to 100644
File size: 3.3 KB
Line 
1/**
2 * @file
3 *
4 * @brief Private Inlined Routines for POSIX Semaphores
5 *
6 * This include file contains the static inline implementation of the private
7 * inlined routines for POSIX Semaphores.
8 */
9
10/*
11 *  COPYRIGHT (c) 1989-2013.
12 *  On-Line Applications Research Corporation (OAR).
13 *
14 *  The license and distribution terms for this file may be
15 *  found in the file LICENSE in this distribution or at
16 *  http://www.rtems.org/license/LICENSE.
17 */
18
19#ifndef _RTEMS_POSIX_SEMAPHOREIMPL_H
20#define _RTEMS_POSIX_SEMAPHOREIMPL_H
21
22#include <rtems/posix/semaphore.h>
23#include <rtems/posix/posixapi.h>
24#include <rtems/score/semaphoreimpl.h>
25#include <rtems/seterr.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31/**
32 * @brief This is a random number used to check if a semaphore object is
33 * properly initialized.
34 */
35#define POSIX_SEMAPHORE_MAGIC 0x5d367fe7UL
36
37/**
38 *  This defines the information control block used to manage
39 *  this class of objects.
40 */
41extern Objects_Information _POSIX_Semaphore_Information;
42
43RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *
44  _POSIX_Semaphore_Allocate_unprotected( void )
45{
46  return (POSIX_Semaphore_Control *)
47    _Objects_Allocate_unprotected( &_POSIX_Semaphore_Information );
48}
49
50/**
51 *  @brief POSIX Semaphore Free
52 *
53 *  This routine frees a semaphore control block to the
54 *  inactive chain of free semaphore control blocks.
55 */
56RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
57  POSIX_Semaphore_Control *the_semaphore
58)
59{
60  _Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
61}
62
63RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get(
64  sem_t *sem
65)
66{
67  return RTEMS_CONTAINER_OF( sem, POSIX_Semaphore_Control, Semaphore );
68}
69
70RTEMS_INLINE_ROUTINE bool _POSIX_Semaphore_Is_named( const sem_t *sem )
71{
72  return sem->_Semaphore._Queue._name != NULL;
73}
74
75RTEMS_INLINE_ROUTINE bool _POSIX_Semaphore_Is_busy( const sem_t *sem )
76{
77  return sem->_Semaphore._Queue._heads != NULL;
78}
79
80RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Initialize(
81  sem_t        *sem,
82  const char   *name,
83  unsigned int  value
84)
85{
86  sem->_flags = (uintptr_t) sem ^ POSIX_SEMAPHORE_MAGIC;
87  _Semaphore_Initialize_named( &sem->_Semaphore, name, value );
88}
89
90RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Destroy( sem_t *sem )
91{
92  sem->_flags = 0;
93  _Semaphore_Destroy( &sem->_Semaphore );
94}
95
96/**
97 *  @brief POSIX Semaphore Delete
98 *
99 * This routine supports the sem_close and sem_unlink routines.
100 */
101void _POSIX_Semaphore_Delete( POSIX_Semaphore_Control *the_semaphore );
102
103/**
104 *  @brief POSIX Semaphore Namespace Remove
105 */
106RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Namespace_remove (
107  POSIX_Semaphore_Control *the_semaphore
108)
109{
110  _Objects_Namespace_remove(
111    &_POSIX_Semaphore_Information, &the_semaphore->Object );
112}
113
114RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get_by_name(
115  const char                *name,
116  size_t                    *name_length_p,
117  Objects_Get_by_name_error *error
118)
119{
120  return (POSIX_Semaphore_Control *) _Objects_Get_by_name(
121    &_POSIX_Semaphore_Information,
122    name,
123    name_length_p,
124    error
125  );
126}
127
128#define POSIX_SEMAPHORE_VALIDATE_OBJECT( sem ) \
129  do { \
130    if ( \
131      ( sem ) == NULL \
132        || ( (uintptr_t) ( sem ) ^ POSIX_SEMAPHORE_MAGIC ) != ( sem )->_flags \
133    ) { \
134      rtems_set_errno_and_return_minus_one( EINVAL ); \
135    } \
136  } while ( 0 )
137
138#ifdef __cplusplus
139}
140#endif
141
142#endif
143/*  end of include file */
Note: See TracBrowser for help on using the repository browser.