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.  */
31 typedef unsigned int __spin_lock_t;
32 
33 /* Static initializer for spinlocks.  */
34 #define __SPIN_LOCK_INITIALIZER   LLL_LOCK_INITIALIZER
35 
36 /* Initialize LOCK.  */
37 
38 extern void __spin_lock_init (__spin_lock_t *__lock);
39 
40 #if defined __USE_EXTERN_INLINES && defined _LIBC
41 _EXTERN_INLINE void
__spin_lock_init(__spin_lock_t * __lock)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.  */
50 extern void __spin_lock_solid (__spin_lock_t *__lock);
51 
52 /* Lock the spin lock LOCK.  */
53 
54 extern void __spin_lock (__spin_lock_t *__lock);
55 
56 #if defined __USE_EXTERN_INLINES && defined _LIBC
57 _EXTERN_INLINE void
__spin_lock(__spin_lock_t * __lock)58 __spin_lock (__spin_lock_t *__lock)
59 {
60   __lll_lock (__lock, 0);
61 }
62 #endif
63 
64 /* Unlock LOCK.  */
65 extern void __spin_unlock (__spin_lock_t *__lock);
66 
67 #if defined __USE_EXTERN_INLINES && defined _LIBC
68 _EXTERN_INLINE void
__spin_unlock(__spin_lock_t * __lock)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.  */
76 extern int __spin_try_lock (__spin_lock_t *__lock);
77 
78 #if defined __USE_EXTERN_INLINES && defined _LIBC
79 _EXTERN_INLINE int
__spin_try_lock(__spin_lock_t * __lock)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.  */
87 extern int __spin_lock_locked (__spin_lock_t *__lock);
88 
89 #if defined __USE_EXTERN_INLINES && defined _LIBC
90 _EXTERN_INLINE int
__spin_lock_locked(__spin_lock_t * __lock)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.  */
98 struct 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.  */
109 extern void __mutex_init (void *__lock);
110 
111 /* Lock the mutex lock LOCK.  */
112 
113 extern void __mutex_lock (void *__lock);
114 
115 #if defined __USE_EXTERN_INLINES && defined _LIBC
116 _EXTERN_INLINE void
__mutex_lock(void * __lock)117 __mutex_lock (void *__lock)
118 {
119   __spin_lock ((__spin_lock_t *)__lock);
120 }
121 #endif
122 
123 /* Unlock the mutex lock LOCK.  */
124 
125 extern void __mutex_unlock (void *__lock);
126 
127 #if defined __USE_EXTERN_INLINES && defined _LIBC
128 _EXTERN_INLINE void
__mutex_unlock(void * __lock)129 __mutex_unlock (void *__lock)
130 {
131   __spin_unlock ((__spin_lock_t *)__lock);
132 }
133 #endif
134 
135 
136 extern int __mutex_trylock (void *__lock);
137 
138 #if defined __USE_EXTERN_INLINES && defined _LIBC
139 _EXTERN_INLINE int
__mutex_trylock(void * __lock)140 __mutex_trylock (void *__lock)
141 {
142   return (__spin_try_lock ((__spin_lock_t *)__lock));
143 }
144 #endif
145 
146 #endif /* lock-intern.h */
147