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

5
Last change on this file since e97806a was 7038271, checked in by Sebastian Huber <sebastian.huber@…>, on 10/25/18 at 10:05:53

Remove RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES

Enable support for string objects names unconditionally. Add const
qualifier throughout. Split _Objects_Namespace_remove() into
_Objects_Namespace_remove_u32() and _Objects_Namespace_remove_string()
to avoid an unnecessary dependency on _Workspace_Free().

Update #2514.

  • Property mode set to 100644
File size: 3.4 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_string(
111    &_POSIX_Semaphore_Information,
112    &the_semaphore->Object
113  );
114}
115
116RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get_by_name(
117  const char                *name,
118  size_t                    *name_length_p,
119  Objects_Get_by_name_error *error
120)
121{
122  return (POSIX_Semaphore_Control *) _Objects_Get_by_name(
123    &_POSIX_Semaphore_Information,
124    name,
125    name_length_p,
126    error
127  );
128}
129
130#define POSIX_SEMAPHORE_VALIDATE_OBJECT( sem ) \
131  do { \
132    if ( \
133      ( sem ) == NULL \
134        || ( (uintptr_t) ( sem ) ^ POSIX_SEMAPHORE_MAGIC ) != ( sem )->_flags \
135    ) { \
136      rtems_set_errno_and_return_minus_one( EINVAL ); \
137    } \
138  } while ( 0 )
139
140#ifdef __cplusplus
141}
142#endif
143
144#endif
145/*  end of include file */
Note: See TracBrowser for help on using the repository browser.