(root)/
glibc-2.38/
mach/
lock-intern.h
       1  /* Copyright (C) 1994-2023 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
      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
      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
      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
      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
      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
     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
     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
     140  __mutex_trylock (void *__lock)
     141  {
     142    return (__spin_try_lock ((__spin_lock_t *)__lock));
     143  }
     144  #endif
     145  
     146  #endif /* lock-intern.h */