1/* Default mutex implementation struct definitions.
2 Copyright (C) 2019-2026 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 <http://www.gnu.org/licenses/>. */
18
19#ifndef _THREAD_MUTEX_INTERNAL_H
20#define _THREAD_MUTEX_INTERNAL_H 1
21
22/* Generic struct for both POSIX and C11 mutexes. New ports are expected
23 to use the default layout, however architecture can redefine it to
24 add arch-specific extension. The struct have a size of 32 bytes on LP32
25 and 40 bytes on LP64 architectures. */
26
27struct __pthread_mutex_s
28{
29 int __lock __LOCK_ALIGNMENT;
30 unsigned int __count;
31 int __owner;
32#if __WORDSIZE == 64
33 unsigned int __nusers;
34#endif
35 /* KIND must stay at this position in the structure to maintain
36 binary compatibility with static initializers.
37
38 Concurrency notes:
39 The __kind of a mutex is initialized either by the static
40 PTHREAD_MUTEX_INITIALIZER or by a call to pthread_mutex_init.
41
42 After a mutex has been initialized, the __kind of a mutex is usually not
43 changed. BUT it can be set to -1 in pthread_mutex_destroy. */
44 int __kind;
45#if __WORDSIZE != 64
46 unsigned int __nusers;
47#endif
48#if __WORDSIZE == 64
49 int __spins;
50 __pthread_list_t __list;
51# define __PTHREAD_MUTEX_HAVE_PREV 1
52#else
53 __extension__ union
54 {
55 int __spins;
56 __pthread_slist_t __list;
57 };
58# define __PTHREAD_MUTEX_HAVE_PREV 0
59#endif
60};
61
62#if __PTHREAD_MUTEX_HAVE_PREV == 1
63# define __PTHREAD_MUTEX_INITIALIZER(__kind) \
64 0, 0, 0, 0, __kind, 0, { 0, 0 }
65#else
66# define __PTHREAD_MUTEX_INITIALIZER(__kind) \
67 0, 0, 0, __kind, 0, { 0 }
68#endif
69
70#endif