about summary refs log tree commit diff
path: root/mach/lock-intern.h
blob: a68674cef44ca90bda818aa97631c16cd23a3b02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* Copyright (C) 1994-2020 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <https://www.gnu.org/licenses/>.  */

#ifndef _LOCK_INTERN_H
#define	_LOCK_INTERN_H

#include <sys/cdefs.h>
#if defined __USE_EXTERN_INLINES && defined _LIBC
# include <lowlevellock.h>
#endif

#ifndef _EXTERN_INLINE
#define _EXTERN_INLINE __extern_inline
#endif

/* The type of a spin lock variable.  */
typedef unsigned int __spin_lock_t;

/* Static initializer for spinlocks.  */
#define __SPIN_LOCK_INITIALIZER   LLL_INITIALIZER

/* Initialize LOCK.  */

extern void __spin_lock_init (__spin_lock_t *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void
__spin_lock_init (__spin_lock_t *__lock)
{
  *__lock = __SPIN_LOCK_INITIALIZER;
}
#endif


/* Lock LOCK, blocking if we can't get it.  */
extern void __spin_lock_solid (__spin_lock_t *__lock);

/* Lock the spin lock LOCK.  */

extern void __spin_lock (__spin_lock_t *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void
__spin_lock (__spin_lock_t *__lock)
{
  lll_lock (__lock, 0);
}
#endif

/* Unlock LOCK.  */
extern void __spin_unlock (__spin_lock_t *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void
__spin_unlock (__spin_lock_t *__lock)
{
  lll_unlock (__lock, 0);
}
#endif

/* Try to lock LOCK; return nonzero if we locked it, zero if another has.  */
extern int __spin_try_lock (__spin_lock_t *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int
__spin_try_lock (__spin_lock_t *__lock)
{
  return (lll_trylock (__lock) == 0);
}
#endif

/* Return nonzero if LOCK is locked.  */
extern int __spin_lock_locked (__spin_lock_t *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int
__spin_lock_locked (__spin_lock_t *__lock)
{
  return (*(volatile __spin_lock_t *)__lock != 0);
}
#endif

/* Name space-clean internal interface to mutex locks.  */
struct mutex {
	__spin_lock_t __held;
	__spin_lock_t __lock;
	const char *__name;
	void *__head, *__tail;
	void *__holder;
};

#define MUTEX_INITIALIZER { __SPIN_LOCK_INITIALIZER }

/* Initialize the newly allocated mutex lock LOCK for further use.  */
extern void __mutex_init (void *__lock);

/* Lock the mutex lock LOCK.  */

extern void __mutex_lock (void *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void
__mutex_lock (void *__lock)
{
  __spin_lock ((__spin_lock_t *)__lock);
}
#endif

/* Unlock the mutex lock LOCK.  */

extern void __mutex_unlock (void *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void
__mutex_unlock (void *__lock)
{
  __spin_unlock ((__spin_lock_t *)__lock);
}
#endif


extern int __mutex_trylock (void *__lock);

#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int
__mutex_trylock (void *__lock)
{
  return (__spin_try_lock ((__spin_lock_t *)__lock));
}
#endif

#endif /* lock-intern.h */