1/* Copyright (C) 1994-2022 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#ifndef _LOCK_INTERN_H
19#define _LOCK_INTERN_H
20
21#include <sys/cdefs.h>
22#if defined __USE_EXTERN_INLINES && defined _LIBC
23# include <lowlevellock.h>
24#endif
25
26#ifndef _EXTERN_INLINE
27#define _EXTERN_INLINE __extern_inline
28#endif
29
30/* The type of a spin lock variable. */
31typedef unsigned int __spin_lock_t;
32
33/* Static initializer for spinlocks. */
34#define __SPIN_LOCK_INITIALIZER LLL_LOCK_INITIALIZER
35
36/* Initialize LOCK. */
37
38extern void __spin_lock_init (__spin_lock_t *__lock);
39
40#if defined __USE_EXTERN_INLINES && defined _LIBC
41_EXTERN_INLINE void
42__spin_lock_init (__spin_lock_t *__lock)
43{
44 *__lock = __SPIN_LOCK_INITIALIZER;
45}
46#endif
47
48
49/* Lock LOCK, blocking if we can't get it. */
50extern void __spin_lock_solid (__spin_lock_t *__lock);
51
52/* Lock the spin lock LOCK. */
53
54extern void __spin_lock (__spin_lock_t *__lock);
55
56#if defined __USE_EXTERN_INLINES && defined _LIBC
57_EXTERN_INLINE void
58__spin_lock (__spin_lock_t *__lock)
59{
60 __lll_lock (__lock, 0);
61}
62#endif
63
64/* Unlock LOCK. */
65extern void __spin_unlock (__spin_lock_t *__lock);
66
67#if defined __USE_EXTERN_INLINES && defined _LIBC
68_EXTERN_INLINE void
69__spin_unlock (__spin_lock_t *__lock)
70{
71 __lll_unlock (__lock, 0);
72}
73#endif
74
75/* Try to lock LOCK; return nonzero if we locked it, zero if another has. */
76extern int __spin_try_lock (__spin_lock_t *__lock);
77
78#if defined __USE_EXTERN_INLINES && defined _LIBC
79_EXTERN_INLINE int
80__spin_try_lock (__spin_lock_t *__lock)
81{
82 return (__lll_trylock (__lock) == 0);
83}
84#endif
85
86/* Return nonzero if LOCK is locked. */
87extern int __spin_lock_locked (__spin_lock_t *__lock);
88
89#if defined __USE_EXTERN_INLINES && defined _LIBC
90_EXTERN_INLINE int
91__spin_lock_locked (__spin_lock_t *__lock)
92{
93 return (*(volatile __spin_lock_t *)__lock != 0);
94}
95#endif
96
97/* Name space-clean internal interface to mutex locks. */
98struct mutex {
99 __spin_lock_t __held;
100 __spin_lock_t __lock;
101 const char *__name;
102 void *__head, *__tail;
103 void *__holder;
104};
105
106#define MUTEX_INITIALIZER { __SPIN_LOCK_INITIALIZER }
107
108/* Initialize the newly allocated mutex lock LOCK for further use. */
109extern void __mutex_init (void *__lock);
110
111/* Lock the mutex lock LOCK. */
112
113extern void __mutex_lock (void *__lock);
114
115#if defined __USE_EXTERN_INLINES && defined _LIBC
116_EXTERN_INLINE void
117__mutex_lock (void *__lock)
118{
119 __spin_lock (lock: (__spin_lock_t *)__lock);
120}
121#endif
122
123/* Unlock the mutex lock LOCK. */
124
125extern void __mutex_unlock (void *__lock);
126
127#if defined __USE_EXTERN_INLINES && defined _LIBC
128_EXTERN_INLINE void
129__mutex_unlock (void *__lock)
130{
131 __spin_unlock (lock: (__spin_lock_t *)__lock);
132}
133#endif
134
135
136extern int __mutex_trylock (void *__lock);
137
138#if defined __USE_EXTERN_INLINES && defined _LIBC
139_EXTERN_INLINE int
140__mutex_trylock (void *__lock)
141{
142 return (__spin_try_lock (lock: (__spin_lock_t *)__lock));
143}
144#endif
145
146#endif /* lock-intern.h */
147

source code of glibc/mach/lock-intern.h