1 /* Machine-specific definition for spin locks.  i386 version.
2    Copyright (C) 1994-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #ifndef _MACHINE_LOCK_H
20 #define	_MACHINE_LOCK_H
21 
22 /* The type of a spin lock variable.  */
23 
24 typedef volatile int __spin_lock_t;
25 
26 /* Value to initialize `__spin_lock_t' variables to.  */
27 
28 #define	__SPIN_LOCK_INITIALIZER	0
29 
30 
31 #ifndef _EXTERN_INLINE
32 #define _EXTERN_INLINE __extern_inline
33 #endif
34 
35 /* Unlock LOCK.  */
36 
37 extern void __spin_unlock (__spin_lock_t *__lock);
38 
39 #if defined __USE_EXTERN_INLINES && defined _LIBC
40 _EXTERN_INLINE void
__spin_unlock(__spin_lock_t * __lock)41 __spin_unlock (__spin_lock_t *__lock)
42 {
43    register int __unlocked;
44    __asm__ __volatile ("xchgl %0, %1"
45 		       : "=&r" (__unlocked), "=m" (*__lock) : "0" (0)
46 		       : "memory");
47 }
48 #endif
49 
50 /* Try to lock LOCK; return nonzero if we locked it, zero if another has.  */
51 
52 extern int __spin_try_lock (__spin_lock_t *__lock);
53 
54 #if defined __USE_EXTERN_INLINES && defined _LIBC
55 _EXTERN_INLINE int
__spin_try_lock(__spin_lock_t * __lock)56 __spin_try_lock (__spin_lock_t *__lock)
57 {
58   register int __locked;
59   __asm__ __volatile ("xchgl %0, %1"
60 		      : "=&r" (__locked), "=m" (*__lock) : "0" (1)
61 		      : "memory");
62   return !__locked;
63 }
64 #endif
65 
66 /* Return nonzero if LOCK is locked.  */
67 
68 extern int __spin_lock_locked (__spin_lock_t *__lock);
69 
70 #if defined __USE_EXTERN_INLINES && defined _LIBC
71 _EXTERN_INLINE int
__spin_lock_locked(__spin_lock_t * __lock)72 __spin_lock_locked (__spin_lock_t *__lock)
73 {
74   return *__lock != 0;
75 }
76 #endif
77 
78 
79 #endif /* machine-lock.h */
80