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