1    	/* Copyright (C) 2002-2015 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   	   <http://www.gnu.org/licenses/>.  */
17   	
18   	#ifndef _BITS_PTHREADTYPES_H
19   	#define _BITS_PTHREADTYPES_H	1
20   	
21   	#include <bits/wordsize.h>
22   	
23   	#ifdef __x86_64__
24   	# if __WORDSIZE == 64
25   	#  define __SIZEOF_PTHREAD_ATTR_T 56
26   	#  define __SIZEOF_PTHREAD_MUTEX_T 40
27   	#  define __SIZEOF_PTHREAD_MUTEXATTR_T 4
28   	#  define __SIZEOF_PTHREAD_COND_T 48
29   	#  define __SIZEOF_PTHREAD_CONDATTR_T 4
30   	#  define __SIZEOF_PTHREAD_RWLOCK_T 56
31   	#  define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
32   	#  define __SIZEOF_PTHREAD_BARRIER_T 32
33   	#  define __SIZEOF_PTHREAD_BARRIERATTR_T 4
34   	# else
35   	#  define __SIZEOF_PTHREAD_ATTR_T 32
36   	#  define __SIZEOF_PTHREAD_MUTEX_T 32
37   	#  define __SIZEOF_PTHREAD_MUTEXATTR_T 4
38   	#  define __SIZEOF_PTHREAD_COND_T 48
39   	#  define __SIZEOF_PTHREAD_CONDATTR_T 4
40   	#  define __SIZEOF_PTHREAD_RWLOCK_T 44
41   	#  define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
42   	#  define __SIZEOF_PTHREAD_BARRIER_T 20
43   	#  define __SIZEOF_PTHREAD_BARRIERATTR_T 4
44   	# endif
45   	#else
46   	# define __SIZEOF_PTHREAD_ATTR_T 36
47   	# define __SIZEOF_PTHREAD_MUTEX_T 24
48   	# define __SIZEOF_PTHREAD_MUTEXATTR_T 4
49   	# define __SIZEOF_PTHREAD_COND_T 48
50   	# define __SIZEOF_PTHREAD_CONDATTR_T 4
51   	# define __SIZEOF_PTHREAD_RWLOCK_T 32
52   	# define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
53   	# define __SIZEOF_PTHREAD_BARRIER_T 20
54   	# define __SIZEOF_PTHREAD_BARRIERATTR_T 4
55   	#endif
56   	
57   	
58   	/* Thread identifiers.  The structure of the attribute type is not
59   	   exposed on purpose.  */
60   	typedef unsigned long int pthread_t;
61   	
62   	
63   	union pthread_attr_t
64   	{
65   	  char __size[__SIZEOF_PTHREAD_ATTR_T];
66   	  long int __align;
67   	};
68   	#ifndef __have_pthread_attr_t
69   	typedef union pthread_attr_t pthread_attr_t;
70   	# define __have_pthread_attr_t	1
71   	#endif
72   	
73   	
74   	#ifdef __x86_64__
75   	typedef struct __pthread_internal_list
76   	{
77   	  struct __pthread_internal_list *__prev;
78   	  struct __pthread_internal_list *__next;
79   	} __pthread_list_t;
80   	#else
81   	typedef struct __pthread_internal_slist
82   	{
83   	  struct __pthread_internal_slist *__next;
84   	} __pthread_slist_t;
85   	#endif
86   	
87   	
88   	/* Data structures for mutex handling.  The structure of the attribute
89   	   type is not exposed on purpose.  */
90   	typedef union
91   	{
92   	  struct __pthread_mutex_s
93   	  {
94   	    int __lock;
95   	    unsigned int __count;
96   	    int __owner;
97   	#ifdef __x86_64__
98   	    unsigned int __nusers;
99   	#endif
100  	    /* KIND must stay at this position in the structure to maintain
101  	       binary compatibility.  */
102  	    int __kind;
103  	#ifdef __x86_64__
104  	    short __spins;
105  	    short __elision;
106  	    __pthread_list_t __list;
107  	# define __PTHREAD_MUTEX_HAVE_PREV	1
108  	/* Mutex __spins initializer used by PTHREAD_MUTEX_INITIALIZER.  */
109  	# define __PTHREAD_SPINS             0, 0
110  	#else
111  	    unsigned int __nusers;
112  	    __extension__ union
113  	    {
114  	      struct
115  	      {
116  		short __espins;
117  		short __elision;
118  	# define __spins __elision_data.__espins
119  	# define __elision __elision_data.__elision
120  	# define __PTHREAD_SPINS         { 0, 0 }
121  	      } __elision_data;
122  	      __pthread_slist_t __list;
123  	    };
124  	#endif
125  	  } __data;
126  	  char __size[__SIZEOF_PTHREAD_MUTEX_T];
127  	  long int __align;
128  	} pthread_mutex_t;
129  	
130  	typedef union
131  	{
132  	  char __size[__SIZEOF_PTHREAD_MUTEXATTR_T];
133  	  int __align;
134  	} pthread_mutexattr_t;
135  	
136  	
137  	/* Data structure for conditional variable handling.  The structure of
138  	   the attribute type is not exposed on purpose.  */
139  	typedef union
140  	{
141  	  struct
142  	  {
143  	    int __lock;
144  	    unsigned int __futex;
145  	    __extension__ unsigned long long int __total_seq;
146  	    __extension__ unsigned long long int __wakeup_seq;
147  	    __extension__ unsigned long long int __woken_seq;
148  	    void *__mutex;
149  	    unsigned int __nwaiters;
150  	    unsigned int __broadcast_seq;
151  	  } __data;
152  	  char __size[__SIZEOF_PTHREAD_COND_T];
153  	  __extension__ long long int __align;
154  	} pthread_cond_t;
155  	
156  	typedef union
157  	{
158  	  char __size[__SIZEOF_PTHREAD_CONDATTR_T];
159  	  int __align;
160  	} pthread_condattr_t;
161  	
162  	
163  	/* Keys for thread-specific data */
164  	typedef unsigned int pthread_key_t;
165  	
166  	
167  	/* Once-only execution */
168  	typedef int pthread_once_t;
169  	
170  	
171  	#if defined __USE_UNIX98 || defined __USE_XOPEN2K
172  	/* Data structure for read-write lock variable handling.  The
173  	   structure of the attribute type is not exposed on purpose.  */
174  	typedef union
175  	{
176  	# ifdef __x86_64__
177  	  struct
178  	  {
179  	    int __lock;
180  	    unsigned int __nr_readers;
181  	    unsigned int __readers_wakeup;
182  	    unsigned int __writer_wakeup;
183  	    unsigned int __nr_readers_queued;
184  	    unsigned int __nr_writers_queued;
185  	    int __writer;
186  	    int __shared;
187  	    signed char __rwelision;
188  	#  ifdef  __ILP32__
189  	    unsigned char __pad1[3];
190  	#    define __PTHREAD_RWLOCK_ELISION_EXTRA 0, { 0, 0, 0 }
191  	#  else
192  	    unsigned char __pad1[7];
193  	#    define __PTHREAD_RWLOCK_ELISION_EXTRA 0, { 0, 0, 0, 0, 0, 0, 0 }
194  	#  endif
195  	    unsigned long int __pad2;
196  	    /* FLAGS must stay at this position in the structure to maintain
197  	       binary compatibility.  */
198  	    unsigned int __flags;
199  	# define __PTHREAD_RWLOCK_INT_FLAGS_SHARED	1
200  	  } __data;
201  	# else
202  	  struct
203  	  {
204  	    int __lock;
205  	    unsigned int __nr_readers;
206  	    unsigned int __readers_wakeup;
207  	    unsigned int __writer_wakeup;
208  	    unsigned int __nr_readers_queued;
209  	    unsigned int __nr_writers_queued;
210  	    /* FLAGS must stay at this position in the structure to maintain
211  	       binary compatibility.  */
212  	    unsigned char __flags;
213  	    unsigned char __shared;
214  	    signed char __rwelision;
215  	# define __PTHREAD_RWLOCK_ELISION_EXTRA 0
216  	    unsigned char __pad2;
217  	    int __writer;
218  	  } __data;
219  	# endif
220  	  char __size[__SIZEOF_PTHREAD_RWLOCK_T];
221  	  long int __align;
222  	} pthread_rwlock_t;
223  	
224  	typedef union
225  	{
226  	  char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T];
227  	  long int __align;
228  	} pthread_rwlockattr_t;
229  	#endif
230  	
231  	
232  	#ifdef __USE_XOPEN2K
233  	/* POSIX spinlock data type.  */
234  	typedef volatile int pthread_spinlock_t;
235  	
236  	
237  	/* POSIX barriers data type.  The structure of the type is
238  	   deliberately not exposed.  */
239  	typedef union
240  	{
241  	  char __size[__SIZEOF_PTHREAD_BARRIER_T];
242  	  long int __align;
243  	} pthread_barrier_t;
244  	
245  	typedef union
246  	{
247  	  char __size[__SIZEOF_PTHREAD_BARRIERATTR_T];
248  	  int __align;
249  	} pthread_barrierattr_t;
250  	#endif
251  	
252  	
253  	#ifndef __x86_64__
254  	/* Extra attributes for the cleanup functions.  */
255  	# define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
256  	#endif
257  	
258  	#endif	/* bits/pthreadtypes.h */
259