summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/spinlockimpl.h
blob: 339e66bd650128517b25b48a6b64034d770bae54 (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 Spinlock Manager
 *
 * This file contains the static inlin implementation of the inlined
 * routines from the POSIX Spinlock 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.com/license/LICENSE.
 */

#ifndef _RTEMS_POSIX_SPINLOCKIMPL_H
#define _RTEMS_POSIX_SPINLOCKIMPL_H

#include <rtems/posix/spinlock.h>
#include <rtems/score/corespinlockimpl.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_Spinlock_Information;

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

void _POSIX_Spinlock_Manager_initialization(void);

/**
 * @brief Translate core spinlock status code.
 *
 * This routine translates SuperCore Spinlock status codes into the
 * corresponding POSIX ones.
 * 
 * @param[in] the_spinlock_status is the SuperCore status.
 *
 * @return the corresponding POSIX status
 */
int _POSIX_Spinlock_Translate_core_spinlock_return_code(
  CORE_spinlock_Status  the_spinlock_status
);

/**
 * @brief Allocate a spinlock control block.
 *
 * This function allocates a spinlock control block from
 * the inactive chain of free spinlock control blocks.
 */
RTEMS_INLINE_ROUTINE POSIX_Spinlock_Control *_POSIX_Spinlock_Allocate( void )
{
  return (POSIX_Spinlock_Control *) 
    _Objects_Allocate( &_POSIX_Spinlock_Information );
}

/**
 * @brief Free a spinlock control block.
 *
 * This routine frees a spinlock control block to the
 * inactive chain of free spinlock control blocks.
 */
RTEMS_INLINE_ROUTINE void _POSIX_Spinlock_Free (
  POSIX_Spinlock_Control *the_spinlock
)
{
  _Objects_Free( &_POSIX_Spinlock_Information, &the_spinlock->Object );
}

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

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

#ifdef __cplusplus
}
#endif

#endif
/*  end of include file */