xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/pthread.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
2*53ee8cc1Swenshuai.xi    Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi    This file is part of the GNU C Library.
4*53ee8cc1Swenshuai.xi 
5*53ee8cc1Swenshuai.xi    The GNU C Library is free software; you can redistribute it and/or
6*53ee8cc1Swenshuai.xi    modify it under the terms of the GNU Lesser General Public
7*53ee8cc1Swenshuai.xi    License as published by the Free Software Foundation; either
8*53ee8cc1Swenshuai.xi    version 2.1 of the License, or (at your option) any later version.
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi    The GNU C Library is distributed in the hope that it will be useful,
11*53ee8cc1Swenshuai.xi    but WITHOUT ANY WARRANTY; without even the implied warranty of
12*53ee8cc1Swenshuai.xi    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*53ee8cc1Swenshuai.xi    Lesser General Public License for more details.
14*53ee8cc1Swenshuai.xi 
15*53ee8cc1Swenshuai.xi    You should have received a copy of the GNU Lesser General Public
16*53ee8cc1Swenshuai.xi    License along with the GNU C Library; if not, write to the Free
17*53ee8cc1Swenshuai.xi    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18*53ee8cc1Swenshuai.xi    02111-1307 USA.  */
19*53ee8cc1Swenshuai.xi 
20*53ee8cc1Swenshuai.xi #ifndef _PTHREAD_H
21*53ee8cc1Swenshuai.xi #define _PTHREAD_H	1
22*53ee8cc1Swenshuai.xi 
23*53ee8cc1Swenshuai.xi #include <features.h>
24*53ee8cc1Swenshuai.xi #include <endian.h>
25*53ee8cc1Swenshuai.xi #include <sched.h>
26*53ee8cc1Swenshuai.xi #include <time.h>
27*53ee8cc1Swenshuai.xi 
28*53ee8cc1Swenshuai.xi #define __need_sigset_t
29*53ee8cc1Swenshuai.xi #include <signal.h>
30*53ee8cc1Swenshuai.xi #include <bits/pthreadtypes.h>
31*53ee8cc1Swenshuai.xi #include <bits/setjmp.h>
32*53ee8cc1Swenshuai.xi #include <bits/wordsize.h>
33*53ee8cc1Swenshuai.xi 
34*53ee8cc1Swenshuai.xi 
35*53ee8cc1Swenshuai.xi /* Detach state.  */
36*53ee8cc1Swenshuai.xi enum
37*53ee8cc1Swenshuai.xi {
38*53ee8cc1Swenshuai.xi   PTHREAD_CREATE_JOINABLE,
39*53ee8cc1Swenshuai.xi #define PTHREAD_CREATE_JOINABLE	PTHREAD_CREATE_JOINABLE
40*53ee8cc1Swenshuai.xi   PTHREAD_CREATE_DETACHED
41*53ee8cc1Swenshuai.xi #define PTHREAD_CREATE_DETACHED	PTHREAD_CREATE_DETACHED
42*53ee8cc1Swenshuai.xi };
43*53ee8cc1Swenshuai.xi 
44*53ee8cc1Swenshuai.xi 
45*53ee8cc1Swenshuai.xi /* Mutex types.  */
46*53ee8cc1Swenshuai.xi enum
47*53ee8cc1Swenshuai.xi {
48*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_TIMED_NP,
49*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_RECURSIVE_NP,
50*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_ERRORCHECK_NP,
51*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_ADAPTIVE_NP
52*53ee8cc1Swenshuai.xi #ifdef __USE_UNIX98
53*53ee8cc1Swenshuai.xi   ,
54*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
55*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
56*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
57*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
58*53ee8cc1Swenshuai.xi #endif
59*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
60*53ee8cc1Swenshuai.xi   /* For compatibility.  */
61*53ee8cc1Swenshuai.xi   , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP
62*53ee8cc1Swenshuai.xi #endif
63*53ee8cc1Swenshuai.xi };
64*53ee8cc1Swenshuai.xi 
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
67*53ee8cc1Swenshuai.xi /* Robust mutex or not flags.  */
68*53ee8cc1Swenshuai.xi enum
69*53ee8cc1Swenshuai.xi {
70*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_STALLED_NP,
71*53ee8cc1Swenshuai.xi   PTHREAD_MUTEX_ROBUST_NP
72*53ee8cc1Swenshuai.xi };
73*53ee8cc1Swenshuai.xi #endif
74*53ee8cc1Swenshuai.xi 
75*53ee8cc1Swenshuai.xi 
76*53ee8cc1Swenshuai.xi #ifdef __USE_UNIX98
77*53ee8cc1Swenshuai.xi /* Mutex protocols.  */
78*53ee8cc1Swenshuai.xi enum
79*53ee8cc1Swenshuai.xi {
80*53ee8cc1Swenshuai.xi   PTHREAD_PRIO_NONE,
81*53ee8cc1Swenshuai.xi   PTHREAD_PRIO_INHERIT,
82*53ee8cc1Swenshuai.xi   PTHREAD_PRIO_PROTECT
83*53ee8cc1Swenshuai.xi };
84*53ee8cc1Swenshuai.xi #endif
85*53ee8cc1Swenshuai.xi 
86*53ee8cc1Swenshuai.xi 
87*53ee8cc1Swenshuai.xi /* Mutex initializers.  */
88*53ee8cc1Swenshuai.xi #if __WORDSIZE == 64
89*53ee8cc1Swenshuai.xi # define PTHREAD_MUTEX_INITIALIZER \
90*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, 0, 0, { 0, 0 } } }
91*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
92*53ee8cc1Swenshuai.xi #  define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
93*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0, 0 } } }
94*53ee8cc1Swenshuai.xi #  define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
95*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0, 0 } } }
96*53ee8cc1Swenshuai.xi #  define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
97*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0, 0 } } }
98*53ee8cc1Swenshuai.xi # endif
99*53ee8cc1Swenshuai.xi #else
100*53ee8cc1Swenshuai.xi # define PTHREAD_MUTEX_INITIALIZER \
101*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, 0, { 0 } } }
102*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
103*53ee8cc1Swenshuai.xi #  define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
104*53ee8cc1Swenshuai.xi   { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0 } } }
105*53ee8cc1Swenshuai.xi #  define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
106*53ee8cc1Swenshuai.xi   { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0 } } }
107*53ee8cc1Swenshuai.xi #  define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
108*53ee8cc1Swenshuai.xi   { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0 } } }
109*53ee8cc1Swenshuai.xi # endif
110*53ee8cc1Swenshuai.xi #endif
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi /* Read-write lock types.  */
114*53ee8cc1Swenshuai.xi #if defined __USE_UNIX98 || defined __USE_XOPEN2K
115*53ee8cc1Swenshuai.xi enum
116*53ee8cc1Swenshuai.xi {
117*53ee8cc1Swenshuai.xi   PTHREAD_RWLOCK_PREFER_READER_NP,
118*53ee8cc1Swenshuai.xi   PTHREAD_RWLOCK_PREFER_WRITER_NP,
119*53ee8cc1Swenshuai.xi   PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
120*53ee8cc1Swenshuai.xi   PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP
121*53ee8cc1Swenshuai.xi };
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi /* Read-write lock initializers.  */
124*53ee8cc1Swenshuai.xi # define PTHREAD_RWLOCK_INITIALIZER \
125*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
126*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
127*53ee8cc1Swenshuai.xi #  if __WORDSIZE == 64
128*53ee8cc1Swenshuai.xi #   define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
129*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,					      \
130*53ee8cc1Swenshuai.xi       PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
131*53ee8cc1Swenshuai.xi #  else
132*53ee8cc1Swenshuai.xi #   if __BYTE_ORDER == __LITTLE_ENDIAN
133*53ee8cc1Swenshuai.xi #    define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
134*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, \
135*53ee8cc1Swenshuai.xi       0, 0, 0, 0 } }
136*53ee8cc1Swenshuai.xi #   else
137*53ee8cc1Swenshuai.xi #    define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
138*53ee8cc1Swenshuai.xi   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,\
139*53ee8cc1Swenshuai.xi       0 } }
140*53ee8cc1Swenshuai.xi #   endif
141*53ee8cc1Swenshuai.xi #  endif
142*53ee8cc1Swenshuai.xi # endif
143*53ee8cc1Swenshuai.xi #endif  /* Unix98 or XOpen2K */
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi /* Scheduler inheritance.  */
147*53ee8cc1Swenshuai.xi enum
148*53ee8cc1Swenshuai.xi {
149*53ee8cc1Swenshuai.xi   PTHREAD_INHERIT_SCHED,
150*53ee8cc1Swenshuai.xi #define PTHREAD_INHERIT_SCHED   PTHREAD_INHERIT_SCHED
151*53ee8cc1Swenshuai.xi   PTHREAD_EXPLICIT_SCHED
152*53ee8cc1Swenshuai.xi #define PTHREAD_EXPLICIT_SCHED  PTHREAD_EXPLICIT_SCHED
153*53ee8cc1Swenshuai.xi };
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi /* Scope handling.  */
157*53ee8cc1Swenshuai.xi enum
158*53ee8cc1Swenshuai.xi {
159*53ee8cc1Swenshuai.xi   PTHREAD_SCOPE_SYSTEM,
160*53ee8cc1Swenshuai.xi #define PTHREAD_SCOPE_SYSTEM    PTHREAD_SCOPE_SYSTEM
161*53ee8cc1Swenshuai.xi   PTHREAD_SCOPE_PROCESS
162*53ee8cc1Swenshuai.xi #define PTHREAD_SCOPE_PROCESS   PTHREAD_SCOPE_PROCESS
163*53ee8cc1Swenshuai.xi };
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi 
166*53ee8cc1Swenshuai.xi /* Process shared or private flag.  */
167*53ee8cc1Swenshuai.xi enum
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi   PTHREAD_PROCESS_PRIVATE,
170*53ee8cc1Swenshuai.xi #define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
171*53ee8cc1Swenshuai.xi   PTHREAD_PROCESS_SHARED
172*53ee8cc1Swenshuai.xi #define PTHREAD_PROCESS_SHARED  PTHREAD_PROCESS_SHARED
173*53ee8cc1Swenshuai.xi };
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi 
177*53ee8cc1Swenshuai.xi /* Conditional variable handling.  */
178*53ee8cc1Swenshuai.xi #define PTHREAD_COND_INITIALIZER { { 0, 0, 0, 0, 0, (void *) 0, 0, 0 } }
179*53ee8cc1Swenshuai.xi 
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi /* Cleanup buffers */
182*53ee8cc1Swenshuai.xi struct _pthread_cleanup_buffer
183*53ee8cc1Swenshuai.xi {
184*53ee8cc1Swenshuai.xi   void (*__routine) (void *);             /* Function to call.  */
185*53ee8cc1Swenshuai.xi   void *__arg;                            /* Its argument.  */
186*53ee8cc1Swenshuai.xi   int __canceltype;                       /* Saved cancellation type. */
187*53ee8cc1Swenshuai.xi   struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions.  */
188*53ee8cc1Swenshuai.xi };
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi /* Cancellation */
191*53ee8cc1Swenshuai.xi enum
192*53ee8cc1Swenshuai.xi {
193*53ee8cc1Swenshuai.xi   PTHREAD_CANCEL_ENABLE,
194*53ee8cc1Swenshuai.xi #define PTHREAD_CANCEL_ENABLE   PTHREAD_CANCEL_ENABLE
195*53ee8cc1Swenshuai.xi   PTHREAD_CANCEL_DISABLE
196*53ee8cc1Swenshuai.xi #define PTHREAD_CANCEL_DISABLE  PTHREAD_CANCEL_DISABLE
197*53ee8cc1Swenshuai.xi };
198*53ee8cc1Swenshuai.xi enum
199*53ee8cc1Swenshuai.xi {
200*53ee8cc1Swenshuai.xi   PTHREAD_CANCEL_DEFERRED,
201*53ee8cc1Swenshuai.xi #define PTHREAD_CANCEL_DEFERRED	PTHREAD_CANCEL_DEFERRED
202*53ee8cc1Swenshuai.xi   PTHREAD_CANCEL_ASYNCHRONOUS
203*53ee8cc1Swenshuai.xi #define PTHREAD_CANCEL_ASYNCHRONOUS	PTHREAD_CANCEL_ASYNCHRONOUS
204*53ee8cc1Swenshuai.xi };
205*53ee8cc1Swenshuai.xi #define PTHREAD_CANCELED ((void *) -1)
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi 
208*53ee8cc1Swenshuai.xi /* Single execution handling.  */
209*53ee8cc1Swenshuai.xi #define PTHREAD_ONCE_INIT 0
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
213*53ee8cc1Swenshuai.xi /* Value returned by 'pthread_barrier_wait' for one of the threads after
214*53ee8cc1Swenshuai.xi    the required number of threads have called this function.
215*53ee8cc1Swenshuai.xi    -1 is distinct from 0 and all errno constants */
216*53ee8cc1Swenshuai.xi # define PTHREAD_BARRIER_SERIAL_THREAD -1
217*53ee8cc1Swenshuai.xi #endif
218*53ee8cc1Swenshuai.xi 
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi __BEGIN_DECLS
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi /* Create a new thread, starting with execution of START-ROUTINE
223*53ee8cc1Swenshuai.xi    getting passed ARG.  Creation attributed come from ATTR.  The new
224*53ee8cc1Swenshuai.xi    handle is stored in *NEWTHREAD.  */
225*53ee8cc1Swenshuai.xi extern int pthread_create (pthread_t *__restrict __newthread,
226*53ee8cc1Swenshuai.xi 			   __const pthread_attr_t *__restrict __attr,
227*53ee8cc1Swenshuai.xi 			   void *(*__start_routine) (void *),
228*53ee8cc1Swenshuai.xi 			   void *__restrict __arg) __THROW __nonnull ((1, 3));
229*53ee8cc1Swenshuai.xi 
230*53ee8cc1Swenshuai.xi /* Terminate calling thread.
231*53ee8cc1Swenshuai.xi 
232*53ee8cc1Swenshuai.xi    The registered cleanup handlers are called via exception handling
233*53ee8cc1Swenshuai.xi    so we cannot mark this function with __THROW.*/
234*53ee8cc1Swenshuai.xi extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi /* Make calling thread wait for termination of the thread TH.  The
237*53ee8cc1Swenshuai.xi    exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN
238*53ee8cc1Swenshuai.xi    is not NULL.
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi    This function is a cancellation point and therefore not marked with
241*53ee8cc1Swenshuai.xi    __THROW.  */
242*53ee8cc1Swenshuai.xi extern int pthread_join (pthread_t __th, void **__thread_return);
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
245*53ee8cc1Swenshuai.xi /* Check whether thread TH has terminated.  If yes return the status of
246*53ee8cc1Swenshuai.xi    the thread in *THREAD_RETURN, if THREAD_RETURN is not NULL.  */
247*53ee8cc1Swenshuai.xi extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) __THROW;
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi /* Make calling thread wait for termination of the thread TH, but only
250*53ee8cc1Swenshuai.xi    until TIMEOUT.  The exit status of the thread is stored in
251*53ee8cc1Swenshuai.xi    *THREAD_RETURN, if THREAD_RETURN is not NULL.
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi    This function is a cancellation point and therefore not marked with
254*53ee8cc1Swenshuai.xi    __THROW.  */
255*53ee8cc1Swenshuai.xi extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return,
256*53ee8cc1Swenshuai.xi 				 __const struct timespec *__abstime);
257*53ee8cc1Swenshuai.xi #endif
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi /* Indicate that the thread TH is never to be joined with PTHREAD_JOIN.
260*53ee8cc1Swenshuai.xi    The resources of TH will therefore be freed immediately when it
261*53ee8cc1Swenshuai.xi    terminates, instead of waiting for another thread to perform PTHREAD_JOIN
262*53ee8cc1Swenshuai.xi    on it.  */
263*53ee8cc1Swenshuai.xi extern int pthread_detach (pthread_t __th) __THROW;
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi 
266*53ee8cc1Swenshuai.xi /* Obtain the identifier of the current thread.  */
267*53ee8cc1Swenshuai.xi extern pthread_t pthread_self (void) __THROW __attribute__ ((__const__));
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi /* Compare two thread identifiers.  */
270*53ee8cc1Swenshuai.xi extern int pthread_equal (pthread_t __thread1, pthread_t __thread2) __THROW;
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi /* Thread attribute handling.  */
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi /* Initialize thread attribute *ATTR with default attributes
276*53ee8cc1Swenshuai.xi    (detachstate is PTHREAD_JOINABLE, scheduling policy is SCHED_OTHER,
277*53ee8cc1Swenshuai.xi     no user-provided stack).  */
278*53ee8cc1Swenshuai.xi extern int pthread_attr_init (pthread_attr_t *__attr) __THROW __nonnull ((1));
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi /* Destroy thread attribute *ATTR.  */
281*53ee8cc1Swenshuai.xi extern int pthread_attr_destroy (pthread_attr_t *__attr)
282*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
283*53ee8cc1Swenshuai.xi 
284*53ee8cc1Swenshuai.xi /* Get detach state attribute.  */
285*53ee8cc1Swenshuai.xi extern int pthread_attr_getdetachstate (__const pthread_attr_t *__attr,
286*53ee8cc1Swenshuai.xi 					int *__detachstate)
287*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
288*53ee8cc1Swenshuai.xi 
289*53ee8cc1Swenshuai.xi /* Set detach state attribute.  */
290*53ee8cc1Swenshuai.xi extern int pthread_attr_setdetachstate (pthread_attr_t *__attr,
291*53ee8cc1Swenshuai.xi 					int __detachstate)
292*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi /* Get the size of the guard area created for stack overflow protection.  */
296*53ee8cc1Swenshuai.xi extern int pthread_attr_getguardsize (__const pthread_attr_t *__attr,
297*53ee8cc1Swenshuai.xi 				      size_t *__guardsize)
298*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi /* Set the size of the guard area created for stack overflow protection.  */
301*53ee8cc1Swenshuai.xi extern int pthread_attr_setguardsize (pthread_attr_t *__attr,
302*53ee8cc1Swenshuai.xi 				      size_t __guardsize)
303*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi /* Return in *PARAM the scheduling parameters of *ATTR.  */
307*53ee8cc1Swenshuai.xi extern int pthread_attr_getschedparam (__const pthread_attr_t *__restrict
308*53ee8cc1Swenshuai.xi 				       __attr,
309*53ee8cc1Swenshuai.xi 				       struct sched_param *__restrict __param)
310*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
311*53ee8cc1Swenshuai.xi 
312*53ee8cc1Swenshuai.xi /* Set scheduling parameters (priority, etc) in *ATTR according to PARAM.  */
313*53ee8cc1Swenshuai.xi extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr,
314*53ee8cc1Swenshuai.xi 				       __const struct sched_param *__restrict
315*53ee8cc1Swenshuai.xi 				       __param) __THROW __nonnull ((1, 2));
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi /* Return in *POLICY the scheduling policy of *ATTR.  */
318*53ee8cc1Swenshuai.xi extern int pthread_attr_getschedpolicy (__const pthread_attr_t *__restrict
319*53ee8cc1Swenshuai.xi 					__attr, int *__restrict __policy)
320*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
321*53ee8cc1Swenshuai.xi 
322*53ee8cc1Swenshuai.xi /* Set scheduling policy in *ATTR according to POLICY.  */
323*53ee8cc1Swenshuai.xi extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy)
324*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi /* Return in *INHERIT the scheduling inheritance mode of *ATTR.  */
327*53ee8cc1Swenshuai.xi extern int pthread_attr_getinheritsched (__const pthread_attr_t *__restrict
328*53ee8cc1Swenshuai.xi 					 __attr, int *__restrict __inherit)
329*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi /* Set scheduling inheritance mode in *ATTR according to INHERIT.  */
332*53ee8cc1Swenshuai.xi extern int pthread_attr_setinheritsched (pthread_attr_t *__attr,
333*53ee8cc1Swenshuai.xi 					 int __inherit)
334*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi /* Return in *SCOPE the scheduling contention scope of *ATTR.  */
338*53ee8cc1Swenshuai.xi extern int pthread_attr_getscope (__const pthread_attr_t *__restrict __attr,
339*53ee8cc1Swenshuai.xi 				  int *__restrict __scope)
340*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
341*53ee8cc1Swenshuai.xi 
342*53ee8cc1Swenshuai.xi /* Set scheduling contention scope in *ATTR according to SCOPE.  */
343*53ee8cc1Swenshuai.xi extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope)
344*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
345*53ee8cc1Swenshuai.xi 
346*53ee8cc1Swenshuai.xi /* Return the previously set address for the stack.  */
347*53ee8cc1Swenshuai.xi extern int pthread_attr_getstackaddr (__const pthread_attr_t *__restrict
348*53ee8cc1Swenshuai.xi 				      __attr, void **__restrict __stackaddr)
349*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2)) __attribute_deprecated__;
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi /* Set the starting address of the stack of the thread to be created.
352*53ee8cc1Swenshuai.xi    Depending on whether the stack grows up or down the value must either
353*53ee8cc1Swenshuai.xi    be higher or lower than all the address in the memory block.  The
354*53ee8cc1Swenshuai.xi    minimal size of the block must be PTHREAD_STACK_MIN.  */
355*53ee8cc1Swenshuai.xi extern int pthread_attr_setstackaddr (pthread_attr_t *__attr,
356*53ee8cc1Swenshuai.xi 				      void *__stackaddr)
357*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1)) __attribute_deprecated__;
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi /* Return the currently used minimal stack size.  */
360*53ee8cc1Swenshuai.xi extern int pthread_attr_getstacksize (__const pthread_attr_t *__restrict
361*53ee8cc1Swenshuai.xi 				      __attr, size_t *__restrict __stacksize)
362*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi /* Add information about the minimum stack size needed for the thread
365*53ee8cc1Swenshuai.xi    to be started.  This size must never be less than PTHREAD_STACK_MIN
366*53ee8cc1Swenshuai.xi    and must also not exceed the system limits.  */
367*53ee8cc1Swenshuai.xi extern int pthread_attr_setstacksize (pthread_attr_t *__attr,
368*53ee8cc1Swenshuai.xi 				      size_t __stacksize)
369*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
372*53ee8cc1Swenshuai.xi /* Return the previously set address for the stack.  */
373*53ee8cc1Swenshuai.xi extern int pthread_attr_getstack (__const pthread_attr_t *__restrict __attr,
374*53ee8cc1Swenshuai.xi 				  void **__restrict __stackaddr,
375*53ee8cc1Swenshuai.xi 				  size_t *__restrict __stacksize)
376*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2, 3));
377*53ee8cc1Swenshuai.xi 
378*53ee8cc1Swenshuai.xi /* The following two interfaces are intended to replace the last two.  They
379*53ee8cc1Swenshuai.xi    require setting the address as well as the size since only setting the
380*53ee8cc1Swenshuai.xi    address will make the implementation on some architectures impossible.  */
381*53ee8cc1Swenshuai.xi extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr,
382*53ee8cc1Swenshuai.xi 				  size_t __stacksize) __THROW __nonnull ((1));
383*53ee8cc1Swenshuai.xi #endif
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
386*53ee8cc1Swenshuai.xi /* Thread created with attribute ATTR will be limited to run only on
387*53ee8cc1Swenshuai.xi    the processors represented in CPUSET.  */
388*53ee8cc1Swenshuai.xi extern int pthread_attr_setaffinity_np (pthread_attr_t *__attr,
389*53ee8cc1Swenshuai.xi 					size_t __cpusetsize,
390*53ee8cc1Swenshuai.xi 					__const cpu_set_t *__cpuset)
391*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 3));
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi /* Get bit set in CPUSET representing the processors threads created with
394*53ee8cc1Swenshuai.xi    ATTR can run on.  */
395*53ee8cc1Swenshuai.xi extern int pthread_attr_getaffinity_np (__const pthread_attr_t *__attr,
396*53ee8cc1Swenshuai.xi 					size_t __cpusetsize,
397*53ee8cc1Swenshuai.xi 					cpu_set_t *__cpuset)
398*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 3));
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi /* Initialize thread attribute *ATTR with attributes corresponding to the
402*53ee8cc1Swenshuai.xi    already running thread TH.  It shall be called on unitialized ATTR
403*53ee8cc1Swenshuai.xi    and destroyed with pthread_attr_destroy when no longer needed.  */
404*53ee8cc1Swenshuai.xi extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
405*53ee8cc1Swenshuai.xi      __THROW __nonnull ((2));
406*53ee8cc1Swenshuai.xi #endif
407*53ee8cc1Swenshuai.xi 
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi /* Functions for scheduling control.  */
410*53ee8cc1Swenshuai.xi 
411*53ee8cc1Swenshuai.xi /* Set the scheduling parameters for TARGET_THREAD according to POLICY
412*53ee8cc1Swenshuai.xi    and *PARAM.  */
413*53ee8cc1Swenshuai.xi extern int pthread_setschedparam (pthread_t __target_thread, int __policy,
414*53ee8cc1Swenshuai.xi 				  __const struct sched_param *__param)
415*53ee8cc1Swenshuai.xi      __THROW __nonnull ((3));
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi /* Return in *POLICY and *PARAM the scheduling parameters for TARGET_THREAD. */
418*53ee8cc1Swenshuai.xi extern int pthread_getschedparam (pthread_t __target_thread,
419*53ee8cc1Swenshuai.xi 				  int *__restrict __policy,
420*53ee8cc1Swenshuai.xi 				  struct sched_param *__restrict __param)
421*53ee8cc1Swenshuai.xi      __THROW __nonnull ((2, 3));
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi /* Set the scheduling priority for TARGET_THREAD.  */
424*53ee8cc1Swenshuai.xi extern int pthread_setschedprio (pthread_t __target_thread, int __prio)
425*53ee8cc1Swenshuai.xi      __THROW;
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi 
428*53ee8cc1Swenshuai.xi #ifdef __USE_UNIX98
429*53ee8cc1Swenshuai.xi /* Determine level of concurrency.  */
430*53ee8cc1Swenshuai.xi extern int pthread_getconcurrency (void) __THROW;
431*53ee8cc1Swenshuai.xi 
432*53ee8cc1Swenshuai.xi /* Set new concurrency level to LEVEL.  */
433*53ee8cc1Swenshuai.xi extern int pthread_setconcurrency (int __level) __THROW;
434*53ee8cc1Swenshuai.xi #endif
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
437*53ee8cc1Swenshuai.xi /* Yield the processor to another thread or process.
438*53ee8cc1Swenshuai.xi    This function is similar to the POSIX `sched_yield' function but
439*53ee8cc1Swenshuai.xi    might be differently implemented in the case of a m-on-n thread
440*53ee8cc1Swenshuai.xi    implementation.  */
441*53ee8cc1Swenshuai.xi extern int pthread_yield (void) __THROW;
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi 
444*53ee8cc1Swenshuai.xi /* Limit specified thread TH to run only on the processors represented
445*53ee8cc1Swenshuai.xi    in CPUSET.  */
446*53ee8cc1Swenshuai.xi extern int pthread_setaffinity_np (pthread_t __th, size_t __cpusetsize,
447*53ee8cc1Swenshuai.xi 				   __const cpu_set_t *__cpuset)
448*53ee8cc1Swenshuai.xi      __THROW __nonnull ((3));
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi /* Get bit set in CPUSET representing the processors TH can run on.  */
451*53ee8cc1Swenshuai.xi extern int pthread_getaffinity_np (pthread_t __th, size_t __cpusetsize,
452*53ee8cc1Swenshuai.xi 				   cpu_set_t *__cpuset)
453*53ee8cc1Swenshuai.xi      __THROW __nonnull ((3));
454*53ee8cc1Swenshuai.xi #endif
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi 
457*53ee8cc1Swenshuai.xi /* Functions for handling initialization.  */
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi /* Guarantee that the initialization function INIT_ROUTINE will be called
460*53ee8cc1Swenshuai.xi    only once, even if pthread_once is executed several times with the
461*53ee8cc1Swenshuai.xi    same ONCE_CONTROL argument. ONCE_CONTROL must point to a static or
462*53ee8cc1Swenshuai.xi    extern variable initialized to PTHREAD_ONCE_INIT.
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi    The initialization functions might throw exception which is why
465*53ee8cc1Swenshuai.xi    this function is not marked with __THROW.  */
466*53ee8cc1Swenshuai.xi extern int pthread_once (pthread_once_t *__once_control,
467*53ee8cc1Swenshuai.xi 			 void (*__init_routine) (void)) __nonnull ((1, 2));
468*53ee8cc1Swenshuai.xi 
469*53ee8cc1Swenshuai.xi 
470*53ee8cc1Swenshuai.xi /* Functions for handling cancellation.
471*53ee8cc1Swenshuai.xi 
472*53ee8cc1Swenshuai.xi    Note that these functions are explicitly not marked to not throw an
473*53ee8cc1Swenshuai.xi    exception in C++ code.  If cancellation is implemented by unwinding
474*53ee8cc1Swenshuai.xi    this is necessary to have the compiler generate the unwind information.  */
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi /* Set cancelability state of current thread to STATE, returning old
477*53ee8cc1Swenshuai.xi    state in *OLDSTATE if OLDSTATE is not NULL.  */
478*53ee8cc1Swenshuai.xi extern int pthread_setcancelstate (int __state, int *__oldstate);
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi /* Set cancellation state of current thread to TYPE, returning the old
481*53ee8cc1Swenshuai.xi    type in *OLDTYPE if OLDTYPE is not NULL.  */
482*53ee8cc1Swenshuai.xi extern int pthread_setcanceltype (int __type, int *__oldtype);
483*53ee8cc1Swenshuai.xi 
484*53ee8cc1Swenshuai.xi /* Cancel THREAD immediately or at the next possibility.  */
485*53ee8cc1Swenshuai.xi extern int pthread_cancel (pthread_t __th);
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi /* Test for pending cancellation for the current thread and terminate
488*53ee8cc1Swenshuai.xi    the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
489*53ee8cc1Swenshuai.xi    cancelled.  */
490*53ee8cc1Swenshuai.xi extern void pthread_testcancel (void);
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi 
493*53ee8cc1Swenshuai.xi /* Cancellation handling with integration into exception handling.  */
494*53ee8cc1Swenshuai.xi 
495*53ee8cc1Swenshuai.xi typedef struct
496*53ee8cc1Swenshuai.xi {
497*53ee8cc1Swenshuai.xi   struct
498*53ee8cc1Swenshuai.xi   {
499*53ee8cc1Swenshuai.xi     __jmp_buf __cancel_jmp_buf;
500*53ee8cc1Swenshuai.xi     int __mask_was_saved;
501*53ee8cc1Swenshuai.xi   } __cancel_jmp_buf[1];
502*53ee8cc1Swenshuai.xi   void *__pad[4];
503*53ee8cc1Swenshuai.xi } __pthread_unwind_buf_t __attribute__ ((__aligned__));
504*53ee8cc1Swenshuai.xi 
505*53ee8cc1Swenshuai.xi /* No special attributes by default.  */
506*53ee8cc1Swenshuai.xi #ifndef __cleanup_fct_attribute
507*53ee8cc1Swenshuai.xi # define __cleanup_fct_attribute
508*53ee8cc1Swenshuai.xi #endif
509*53ee8cc1Swenshuai.xi 
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi /* Structure to hold the cleanup handler information.  */
512*53ee8cc1Swenshuai.xi struct __pthread_cleanup_frame
513*53ee8cc1Swenshuai.xi {
514*53ee8cc1Swenshuai.xi   void (*__cancel_routine) (void *);
515*53ee8cc1Swenshuai.xi   void *__cancel_arg;
516*53ee8cc1Swenshuai.xi   int __do_it;
517*53ee8cc1Swenshuai.xi   int __cancel_type;
518*53ee8cc1Swenshuai.xi };
519*53ee8cc1Swenshuai.xi 
520*53ee8cc1Swenshuai.xi #if defined __GNUC__ && defined __EXCEPTIONS
521*53ee8cc1Swenshuai.xi # ifdef __cplusplus
522*53ee8cc1Swenshuai.xi /* Class to handle cancellation handler invocation.  */
523*53ee8cc1Swenshuai.xi class __pthread_cleanup_class
524*53ee8cc1Swenshuai.xi {
525*53ee8cc1Swenshuai.xi   void (*__cancel_routine) (void *);
526*53ee8cc1Swenshuai.xi   void *__cancel_arg;
527*53ee8cc1Swenshuai.xi   int __do_it;
528*53ee8cc1Swenshuai.xi   int __cancel_type;
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi  public:
__pthread_cleanup_class(void (* __fct)(void *),void * __arg)531*53ee8cc1Swenshuai.xi   __pthread_cleanup_class (void (*__fct) (void *), void *__arg)
532*53ee8cc1Swenshuai.xi     : __cancel_routine (__fct), __cancel_arg (__arg), __do_it (1) { }
~__pthread_cleanup_class()533*53ee8cc1Swenshuai.xi   ~__pthread_cleanup_class () { if (__do_it) __cancel_routine (__cancel_arg); }
__setdoit(int __newval)534*53ee8cc1Swenshuai.xi   void __setdoit (int __newval) { __do_it = __newval; }
__defer()535*53ee8cc1Swenshuai.xi   void __defer () { pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED,
536*53ee8cc1Swenshuai.xi 					   &__cancel_type); }
__restore()537*53ee8cc1Swenshuai.xi   void __restore () const { pthread_setcanceltype (__cancel_type, 0); }
538*53ee8cc1Swenshuai.xi };
539*53ee8cc1Swenshuai.xi 
540*53ee8cc1Swenshuai.xi /* Install a cleanup handler: ROUTINE will be called with arguments ARG
541*53ee8cc1Swenshuai.xi    when the thread is canceled or calls pthread_exit.  ROUTINE will also
542*53ee8cc1Swenshuai.xi    be called with arguments ARG when the matching pthread_cleanup_pop
543*53ee8cc1Swenshuai.xi    is executed with non-zero EXECUTE argument.
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi    pthread_cleanup_push and pthread_cleanup_pop are macros and must always
546*53ee8cc1Swenshuai.xi    be used in matching pairs at the same nesting level of braces.  */
547*53ee8cc1Swenshuai.xi #  define pthread_cleanup_push(routine, arg) \
548*53ee8cc1Swenshuai.xi   do {									      \
549*53ee8cc1Swenshuai.xi     __pthread_cleanup_class __clframe (routine, arg)
550*53ee8cc1Swenshuai.xi 
551*53ee8cc1Swenshuai.xi /* Remove a cleanup handler installed by the matching pthread_cleanup_push.
552*53ee8cc1Swenshuai.xi    If EXECUTE is non-zero, the handler function is called. */
553*53ee8cc1Swenshuai.xi #  define pthread_cleanup_pop(execute) \
554*53ee8cc1Swenshuai.xi     __clframe.__setdoit (execute);					      \
555*53ee8cc1Swenshuai.xi   } while (0)
556*53ee8cc1Swenshuai.xi 
557*53ee8cc1Swenshuai.xi #  ifdef __USE_GNU
558*53ee8cc1Swenshuai.xi /* Install a cleanup handler as pthread_cleanup_push does, but also
559*53ee8cc1Swenshuai.xi    saves the current cancellation type and sets it to deferred
560*53ee8cc1Swenshuai.xi    cancellation.  */
561*53ee8cc1Swenshuai.xi #   define pthread_cleanup_push_defer_np(routine, arg) \
562*53ee8cc1Swenshuai.xi   do {									      \
563*53ee8cc1Swenshuai.xi     __pthread_cleanup_class __clframe (routine, arg);			      \
564*53ee8cc1Swenshuai.xi     __clframe.__defer ()
565*53ee8cc1Swenshuai.xi 
566*53ee8cc1Swenshuai.xi /* Remove a cleanup handler as pthread_cleanup_pop does, but also
567*53ee8cc1Swenshuai.xi    restores the cancellation type that was in effect when the matching
568*53ee8cc1Swenshuai.xi    pthread_cleanup_push_defer was called.  */
569*53ee8cc1Swenshuai.xi #   define pthread_cleanup_pop_restore_np(execute) \
570*53ee8cc1Swenshuai.xi     __clframe.__restore ();						      \
571*53ee8cc1Swenshuai.xi     __clframe.__setdoit (execute);					      \
572*53ee8cc1Swenshuai.xi   } while (0)
573*53ee8cc1Swenshuai.xi #  endif
574*53ee8cc1Swenshuai.xi # else
575*53ee8cc1Swenshuai.xi /* Function called to call the cleanup handler.  As an extern inline
576*53ee8cc1Swenshuai.xi    function the compiler is free to decide inlining the change when
577*53ee8cc1Swenshuai.xi    needed or fall back on the copy which must exist somewhere
578*53ee8cc1Swenshuai.xi    else.  */
579*53ee8cc1Swenshuai.xi __extern_inline void
__pthread_cleanup_routine(struct __pthread_cleanup_frame * __frame)580*53ee8cc1Swenshuai.xi __pthread_cleanup_routine (struct __pthread_cleanup_frame *__frame)
581*53ee8cc1Swenshuai.xi {
582*53ee8cc1Swenshuai.xi   if (__frame->__do_it)
583*53ee8cc1Swenshuai.xi     __frame->__cancel_routine (__frame->__cancel_arg);
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi 
586*53ee8cc1Swenshuai.xi /* Install a cleanup handler: ROUTINE will be called with arguments ARG
587*53ee8cc1Swenshuai.xi    when the thread is canceled or calls pthread_exit.  ROUTINE will also
588*53ee8cc1Swenshuai.xi    be called with arguments ARG when the matching pthread_cleanup_pop
589*53ee8cc1Swenshuai.xi    is executed with non-zero EXECUTE argument.
590*53ee8cc1Swenshuai.xi 
591*53ee8cc1Swenshuai.xi    pthread_cleanup_push and pthread_cleanup_pop are macros and must always
592*53ee8cc1Swenshuai.xi    be used in matching pairs at the same nesting level of braces.  */
593*53ee8cc1Swenshuai.xi #  define pthread_cleanup_push(routine, arg) \
594*53ee8cc1Swenshuai.xi   do {									      \
595*53ee8cc1Swenshuai.xi     struct __pthread_cleanup_frame __clframe				      \
596*53ee8cc1Swenshuai.xi       __attribute__ ((__cleanup__ (__pthread_cleanup_routine)))		      \
597*53ee8cc1Swenshuai.xi       = { .__cancel_routine = (routine), .__cancel_arg = (arg),	 	      \
598*53ee8cc1Swenshuai.xi 	  .__do_it = 1 };
599*53ee8cc1Swenshuai.xi 
600*53ee8cc1Swenshuai.xi /* Remove a cleanup handler installed by the matching pthread_cleanup_push.
601*53ee8cc1Swenshuai.xi    If EXECUTE is non-zero, the handler function is called. */
602*53ee8cc1Swenshuai.xi #  define pthread_cleanup_pop(execute) \
603*53ee8cc1Swenshuai.xi     __clframe.__do_it = (execute);					      \
604*53ee8cc1Swenshuai.xi   } while (0)
605*53ee8cc1Swenshuai.xi 
606*53ee8cc1Swenshuai.xi #  ifdef __USE_GNU
607*53ee8cc1Swenshuai.xi /* Install a cleanup handler as pthread_cleanup_push does, but also
608*53ee8cc1Swenshuai.xi    saves the current cancellation type and sets it to deferred
609*53ee8cc1Swenshuai.xi    cancellation.  */
610*53ee8cc1Swenshuai.xi #   define pthread_cleanup_push_defer_np(routine, arg) \
611*53ee8cc1Swenshuai.xi   do {									      \
612*53ee8cc1Swenshuai.xi     struct __pthread_cleanup_frame __clframe				      \
613*53ee8cc1Swenshuai.xi       __attribute__ ((__cleanup__ (__pthread_cleanup_routine)))		      \
614*53ee8cc1Swenshuai.xi       = { .__cancel_routine = (routine), .__cancel_arg = (arg),		      \
615*53ee8cc1Swenshuai.xi 	  .__do_it = 1 };						      \
616*53ee8cc1Swenshuai.xi     (void) pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED,		      \
617*53ee8cc1Swenshuai.xi 				  &__clframe.__cancel_type)
618*53ee8cc1Swenshuai.xi 
619*53ee8cc1Swenshuai.xi /* Remove a cleanup handler as pthread_cleanup_pop does, but also
620*53ee8cc1Swenshuai.xi    restores the cancellation type that was in effect when the matching
621*53ee8cc1Swenshuai.xi    pthread_cleanup_push_defer was called.  */
622*53ee8cc1Swenshuai.xi #   define pthread_cleanup_pop_restore_np(execute) \
623*53ee8cc1Swenshuai.xi     (void) pthread_setcanceltype (__clframe.__cancel_type, NULL);	      \
624*53ee8cc1Swenshuai.xi     __clframe.__do_it = (execute);					      \
625*53ee8cc1Swenshuai.xi   } while (0)
626*53ee8cc1Swenshuai.xi #  endif
627*53ee8cc1Swenshuai.xi # endif
628*53ee8cc1Swenshuai.xi #else
629*53ee8cc1Swenshuai.xi /* Install a cleanup handler: ROUTINE will be called with arguments ARG
630*53ee8cc1Swenshuai.xi    when the thread is canceled or calls pthread_exit.  ROUTINE will also
631*53ee8cc1Swenshuai.xi    be called with arguments ARG when the matching pthread_cleanup_pop
632*53ee8cc1Swenshuai.xi    is executed with non-zero EXECUTE argument.
633*53ee8cc1Swenshuai.xi 
634*53ee8cc1Swenshuai.xi    pthread_cleanup_push and pthread_cleanup_pop are macros and must always
635*53ee8cc1Swenshuai.xi    be used in matching pairs at the same nesting level of braces.  */
636*53ee8cc1Swenshuai.xi # define pthread_cleanup_push(routine, arg) \
637*53ee8cc1Swenshuai.xi   do {									      \
638*53ee8cc1Swenshuai.xi     __pthread_unwind_buf_t __cancel_buf;				      \
639*53ee8cc1Swenshuai.xi     void (*__cancel_routine) (void *) = (routine);			      \
640*53ee8cc1Swenshuai.xi     void *__cancel_arg = (arg);						      \
641*53ee8cc1Swenshuai.xi     int not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *)	      \
642*53ee8cc1Swenshuai.xi 				      __cancel_buf.__cancel_jmp_buf, 0);      \
643*53ee8cc1Swenshuai.xi     if (__builtin_expect (not_first_call, 0))				      \
644*53ee8cc1Swenshuai.xi       {									      \
645*53ee8cc1Swenshuai.xi 	__cancel_routine (__cancel_arg);				      \
646*53ee8cc1Swenshuai.xi 	__pthread_unwind_next (&__cancel_buf);				      \
647*53ee8cc1Swenshuai.xi 	/* NOTREACHED */						      \
648*53ee8cc1Swenshuai.xi       }									      \
649*53ee8cc1Swenshuai.xi 									      \
650*53ee8cc1Swenshuai.xi     __pthread_register_cancel (&__cancel_buf);				      \
651*53ee8cc1Swenshuai.xi     do {
652*53ee8cc1Swenshuai.xi extern void __pthread_register_cancel (__pthread_unwind_buf_t *__buf)
653*53ee8cc1Swenshuai.xi      __cleanup_fct_attribute;
654*53ee8cc1Swenshuai.xi 
655*53ee8cc1Swenshuai.xi /* Remove a cleanup handler installed by the matching pthread_cleanup_push.
656*53ee8cc1Swenshuai.xi    If EXECUTE is non-zero, the handler function is called. */
657*53ee8cc1Swenshuai.xi # define pthread_cleanup_pop(execute) \
658*53ee8cc1Swenshuai.xi       do; while (0); /* Empty to allow label before pthread_cleanup_pop.  */  \
659*53ee8cc1Swenshuai.xi     } while (0);							      \
660*53ee8cc1Swenshuai.xi     __pthread_unregister_cancel (&__cancel_buf);			      \
661*53ee8cc1Swenshuai.xi     if (execute)							      \
662*53ee8cc1Swenshuai.xi       __cancel_routine (__cancel_arg);					      \
663*53ee8cc1Swenshuai.xi   } while (0)
664*53ee8cc1Swenshuai.xi extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf)
665*53ee8cc1Swenshuai.xi   __cleanup_fct_attribute;
666*53ee8cc1Swenshuai.xi 
667*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
668*53ee8cc1Swenshuai.xi /* Install a cleanup handler as pthread_cleanup_push does, but also
669*53ee8cc1Swenshuai.xi    saves the current cancellation type and sets it to deferred
670*53ee8cc1Swenshuai.xi    cancellation.  */
671*53ee8cc1Swenshuai.xi #  define pthread_cleanup_push_defer_np(routine, arg) \
672*53ee8cc1Swenshuai.xi   do {									      \
673*53ee8cc1Swenshuai.xi     __pthread_unwind_buf_t __cancel_buf;				      \
674*53ee8cc1Swenshuai.xi     void (*__cancel_routine) (void *) = (routine);			      \
675*53ee8cc1Swenshuai.xi     void *__cancel_arg = (arg);						      \
676*53ee8cc1Swenshuai.xi     int not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *)	      \
677*53ee8cc1Swenshuai.xi 				      __cancel_buf.__cancel_jmp_buf, 0);      \
678*53ee8cc1Swenshuai.xi     if (__builtin_expect (not_first_call, 0))				      \
679*53ee8cc1Swenshuai.xi       {									      \
680*53ee8cc1Swenshuai.xi 	__cancel_routine (__cancel_arg);				      \
681*53ee8cc1Swenshuai.xi 	__pthread_unwind_next (&__cancel_buf);				      \
682*53ee8cc1Swenshuai.xi 	/* NOTREACHED */						      \
683*53ee8cc1Swenshuai.xi       }									      \
684*53ee8cc1Swenshuai.xi 									      \
685*53ee8cc1Swenshuai.xi     __pthread_register_cancel_defer (&__cancel_buf);			      \
686*53ee8cc1Swenshuai.xi     do {
687*53ee8cc1Swenshuai.xi extern void __pthread_register_cancel_defer (__pthread_unwind_buf_t *__buf)
688*53ee8cc1Swenshuai.xi      __cleanup_fct_attribute;
689*53ee8cc1Swenshuai.xi 
690*53ee8cc1Swenshuai.xi /* Remove a cleanup handler as pthread_cleanup_pop does, but also
691*53ee8cc1Swenshuai.xi    restores the cancellation type that was in effect when the matching
692*53ee8cc1Swenshuai.xi    pthread_cleanup_push_defer was called.  */
693*53ee8cc1Swenshuai.xi #  define pthread_cleanup_pop_restore_np(execute) \
694*53ee8cc1Swenshuai.xi       do; while (0); /* Empty to allow label before pthread_cleanup_pop.  */  \
695*53ee8cc1Swenshuai.xi     } while (0);							      \
696*53ee8cc1Swenshuai.xi     __pthread_unregister_cancel_restore (&__cancel_buf);		      \
697*53ee8cc1Swenshuai.xi     if (execute)							      \
698*53ee8cc1Swenshuai.xi       __cancel_routine (__cancel_arg);					      \
699*53ee8cc1Swenshuai.xi   } while (0)
700*53ee8cc1Swenshuai.xi extern void __pthread_unregister_cancel_restore (__pthread_unwind_buf_t *__buf)
701*53ee8cc1Swenshuai.xi   __cleanup_fct_attribute;
702*53ee8cc1Swenshuai.xi # endif
703*53ee8cc1Swenshuai.xi 
704*53ee8cc1Swenshuai.xi /* Internal interface to initiate cleanup.  */
705*53ee8cc1Swenshuai.xi extern void __pthread_unwind_next (__pthread_unwind_buf_t *__buf)
706*53ee8cc1Swenshuai.xi      __cleanup_fct_attribute __attribute__ ((__noreturn__))
707*53ee8cc1Swenshuai.xi # ifndef SHARED
708*53ee8cc1Swenshuai.xi      __attribute__ ((__weak__))
709*53ee8cc1Swenshuai.xi # endif
710*53ee8cc1Swenshuai.xi      ;
711*53ee8cc1Swenshuai.xi #endif
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi /* Function used in the macros.  */
714*53ee8cc1Swenshuai.xi struct __jmp_buf_tag;
715*53ee8cc1Swenshuai.xi extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROW;
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi 
718*53ee8cc1Swenshuai.xi /* Mutex handling.  */
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi /* Initialize a mutex.  */
721*53ee8cc1Swenshuai.xi extern int pthread_mutex_init (pthread_mutex_t *__mutex,
722*53ee8cc1Swenshuai.xi 			       __const pthread_mutexattr_t *__mutexattr)
723*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi /* Destroy a mutex.  */
726*53ee8cc1Swenshuai.xi extern int pthread_mutex_destroy (pthread_mutex_t *__mutex)
727*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
728*53ee8cc1Swenshuai.xi 
729*53ee8cc1Swenshuai.xi /* Try locking a mutex.  */
730*53ee8cc1Swenshuai.xi extern int pthread_mutex_trylock (pthread_mutex_t *__mutex)
731*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi /* Lock a mutex.  */
734*53ee8cc1Swenshuai.xi extern int pthread_mutex_lock (pthread_mutex_t *__mutex)
735*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
736*53ee8cc1Swenshuai.xi 
737*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
738*53ee8cc1Swenshuai.xi /* Wait until lock becomes available, or specified time passes. */
739*53ee8cc1Swenshuai.xi extern int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,
740*53ee8cc1Swenshuai.xi                                     __const struct timespec *__restrict
741*53ee8cc1Swenshuai.xi                                     __abstime) __THROW __nonnull ((1, 2));
742*53ee8cc1Swenshuai.xi #endif
743*53ee8cc1Swenshuai.xi 
744*53ee8cc1Swenshuai.xi /* Unlock a mutex.  */
745*53ee8cc1Swenshuai.xi extern int pthread_mutex_unlock (pthread_mutex_t *__mutex)
746*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi 
749*53ee8cc1Swenshuai.xi #ifdef __USE_UNIX98
750*53ee8cc1Swenshuai.xi /* Get the priority ceiling of MUTEX.  */
751*53ee8cc1Swenshuai.xi extern int pthread_mutex_getprioceiling (__const pthread_mutex_t *
752*53ee8cc1Swenshuai.xi 					 __restrict __mutex,
753*53ee8cc1Swenshuai.xi 					 int *__restrict __prioceiling)
754*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
755*53ee8cc1Swenshuai.xi 
756*53ee8cc1Swenshuai.xi /* Set the priority ceiling of MUTEX to PRIOCEILING, return old
757*53ee8cc1Swenshuai.xi    priority ceiling value in *OLD_CEILING.  */
758*53ee8cc1Swenshuai.xi extern int pthread_mutex_setprioceiling (pthread_mutex_t *__restrict __mutex,
759*53ee8cc1Swenshuai.xi 					 int __prioceiling,
760*53ee8cc1Swenshuai.xi 					 int *__restrict __old_ceiling)
761*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 3));
762*53ee8cc1Swenshuai.xi #endif
763*53ee8cc1Swenshuai.xi 
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
766*53ee8cc1Swenshuai.xi /* Declare the state protected by MUTEX as consistent.  */
767*53ee8cc1Swenshuai.xi extern int pthread_mutex_consistent_np (pthread_mutex_t *__mutex)
768*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
769*53ee8cc1Swenshuai.xi #endif
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi 
772*53ee8cc1Swenshuai.xi /* Functions for handling mutex attributes.  */
773*53ee8cc1Swenshuai.xi 
774*53ee8cc1Swenshuai.xi /* Initialize mutex attribute object ATTR with default attributes
775*53ee8cc1Swenshuai.xi    (kind is PTHREAD_MUTEX_TIMED_NP).  */
776*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_init (pthread_mutexattr_t *__attr)
777*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
778*53ee8cc1Swenshuai.xi 
779*53ee8cc1Swenshuai.xi /* Destroy mutex attribute object ATTR.  */
780*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr)
781*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
782*53ee8cc1Swenshuai.xi 
783*53ee8cc1Swenshuai.xi /* Get the process-shared flag of the mutex attribute ATTR.  */
784*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_getpshared (__const pthread_mutexattr_t *
785*53ee8cc1Swenshuai.xi 					 __restrict __attr,
786*53ee8cc1Swenshuai.xi 					 int *__restrict __pshared)
787*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
788*53ee8cc1Swenshuai.xi 
789*53ee8cc1Swenshuai.xi /* Set the process-shared flag of the mutex attribute ATTR.  */
790*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr,
791*53ee8cc1Swenshuai.xi 					 int __pshared)
792*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi #ifdef __USE_UNIX98
795*53ee8cc1Swenshuai.xi /* Return in *KIND the mutex kind attribute in *ATTR.  */
796*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_gettype (__const pthread_mutexattr_t *__restrict
797*53ee8cc1Swenshuai.xi 				      __attr, int *__restrict __kind)
798*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
799*53ee8cc1Swenshuai.xi 
800*53ee8cc1Swenshuai.xi /* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL,
801*53ee8cc1Swenshuai.xi    PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or
802*53ee8cc1Swenshuai.xi    PTHREAD_MUTEX_DEFAULT).  */
803*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
804*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi /* Return in *PROTOCOL the mutex protocol attribute in *ATTR.  */
807*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_getprotocol (__const pthread_mutexattr_t *
808*53ee8cc1Swenshuai.xi 					  __restrict __attr,
809*53ee8cc1Swenshuai.xi 					  int *__restrict __protocol)
810*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
811*53ee8cc1Swenshuai.xi 
812*53ee8cc1Swenshuai.xi /* Set the mutex protocol attribute in *ATTR to PROTOCOL (either
813*53ee8cc1Swenshuai.xi    PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, or PTHREAD_PRIO_PROTECT).  */
814*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr,
815*53ee8cc1Swenshuai.xi 					  int __protocol)
816*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
817*53ee8cc1Swenshuai.xi 
818*53ee8cc1Swenshuai.xi /* Return in *PRIOCEILING the mutex prioceiling attribute in *ATTR.  */
819*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_getprioceiling (__const pthread_mutexattr_t *
820*53ee8cc1Swenshuai.xi 					     __restrict __attr,
821*53ee8cc1Swenshuai.xi 					     int *__restrict __prioceiling)
822*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
823*53ee8cc1Swenshuai.xi 
824*53ee8cc1Swenshuai.xi /* Set the mutex prioceiling attribute in *ATTR to PRIOCEILING.  */
825*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr,
826*53ee8cc1Swenshuai.xi 					     int __prioceiling)
827*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
828*53ee8cc1Swenshuai.xi #endif
829*53ee8cc1Swenshuai.xi 
830*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
831*53ee8cc1Swenshuai.xi /* Get the robustness flag of the mutex attribute ATTR.  */
832*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_getrobust_np (__const pthread_mutexattr_t *__attr,
833*53ee8cc1Swenshuai.xi 					   int *__robustness)
834*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
835*53ee8cc1Swenshuai.xi 
836*53ee8cc1Swenshuai.xi /* Set the robustness flag of the mutex attribute ATTR.  */
837*53ee8cc1Swenshuai.xi extern int pthread_mutexattr_setrobust_np (pthread_mutexattr_t *__attr,
838*53ee8cc1Swenshuai.xi 					   int __robustness)
839*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
840*53ee8cc1Swenshuai.xi #endif
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi #if defined __USE_UNIX98 || defined __USE_XOPEN2K
844*53ee8cc1Swenshuai.xi /* Functions for handling read-write locks.  */
845*53ee8cc1Swenshuai.xi 
846*53ee8cc1Swenshuai.xi /* Initialize read-write lock RWLOCK using attributes ATTR, or use
847*53ee8cc1Swenshuai.xi    the default values if later is NULL.  */
848*53ee8cc1Swenshuai.xi extern int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock,
849*53ee8cc1Swenshuai.xi 				__const pthread_rwlockattr_t *__restrict
850*53ee8cc1Swenshuai.xi 				__attr) __THROW __nonnull ((1));
851*53ee8cc1Swenshuai.xi 
852*53ee8cc1Swenshuai.xi /* Destroy read-write lock RWLOCK.  */
853*53ee8cc1Swenshuai.xi extern int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock)
854*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
855*53ee8cc1Swenshuai.xi 
856*53ee8cc1Swenshuai.xi /* Acquire read lock for RWLOCK.  */
857*53ee8cc1Swenshuai.xi extern int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock)
858*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
859*53ee8cc1Swenshuai.xi 
860*53ee8cc1Swenshuai.xi /* Try to acquire read lock for RWLOCK.  */
861*53ee8cc1Swenshuai.xi extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock)
862*53ee8cc1Swenshuai.xi   __THROW __nonnull ((1));
863*53ee8cc1Swenshuai.xi 
864*53ee8cc1Swenshuai.xi # ifdef __USE_XOPEN2K
865*53ee8cc1Swenshuai.xi /* Try to acquire read lock for RWLOCK or return after specfied time.  */
866*53ee8cc1Swenshuai.xi extern int pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock,
867*53ee8cc1Swenshuai.xi 				       __const struct timespec *__restrict
868*53ee8cc1Swenshuai.xi 				       __abstime) __THROW __nonnull ((1, 2));
869*53ee8cc1Swenshuai.xi # endif
870*53ee8cc1Swenshuai.xi 
871*53ee8cc1Swenshuai.xi /* Acquire write lock for RWLOCK.  */
872*53ee8cc1Swenshuai.xi extern int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock)
873*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
874*53ee8cc1Swenshuai.xi 
875*53ee8cc1Swenshuai.xi /* Try to acquire write lock for RWLOCK.  */
876*53ee8cc1Swenshuai.xi extern int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock)
877*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
878*53ee8cc1Swenshuai.xi 
879*53ee8cc1Swenshuai.xi # ifdef __USE_XOPEN2K
880*53ee8cc1Swenshuai.xi /* Try to acquire write lock for RWLOCK or return after specfied time.  */
881*53ee8cc1Swenshuai.xi extern int pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock,
882*53ee8cc1Swenshuai.xi 				       __const struct timespec *__restrict
883*53ee8cc1Swenshuai.xi 				       __abstime) __THROW __nonnull ((1, 2));
884*53ee8cc1Swenshuai.xi # endif
885*53ee8cc1Swenshuai.xi 
886*53ee8cc1Swenshuai.xi /* Unlock RWLOCK.  */
887*53ee8cc1Swenshuai.xi extern int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock)
888*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
889*53ee8cc1Swenshuai.xi 
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi /* Functions for handling read-write lock attributes.  */
892*53ee8cc1Swenshuai.xi 
893*53ee8cc1Swenshuai.xi /* Initialize attribute object ATTR with default values.  */
894*53ee8cc1Swenshuai.xi extern int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr)
895*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
896*53ee8cc1Swenshuai.xi 
897*53ee8cc1Swenshuai.xi /* Destroy attribute object ATTR.  */
898*53ee8cc1Swenshuai.xi extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr)
899*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
900*53ee8cc1Swenshuai.xi 
901*53ee8cc1Swenshuai.xi /* Return current setting of process-shared attribute of ATTR in PSHARED.  */
902*53ee8cc1Swenshuai.xi extern int pthread_rwlockattr_getpshared (__const pthread_rwlockattr_t *
903*53ee8cc1Swenshuai.xi 					  __restrict __attr,
904*53ee8cc1Swenshuai.xi 					  int *__restrict __pshared)
905*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
906*53ee8cc1Swenshuai.xi 
907*53ee8cc1Swenshuai.xi /* Set process-shared attribute of ATTR to PSHARED.  */
908*53ee8cc1Swenshuai.xi extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr,
909*53ee8cc1Swenshuai.xi 					  int __pshared)
910*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
911*53ee8cc1Swenshuai.xi 
912*53ee8cc1Swenshuai.xi /* Return current setting of reader/writer preference.  */
913*53ee8cc1Swenshuai.xi extern int pthread_rwlockattr_getkind_np (__const pthread_rwlockattr_t *
914*53ee8cc1Swenshuai.xi 					  __restrict __attr,
915*53ee8cc1Swenshuai.xi 					  int *__restrict __pref)
916*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
917*53ee8cc1Swenshuai.xi 
918*53ee8cc1Swenshuai.xi /* Set reader/write preference.  */
919*53ee8cc1Swenshuai.xi extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
920*53ee8cc1Swenshuai.xi 					  int __pref) __THROW __nonnull ((1));
921*53ee8cc1Swenshuai.xi #endif
922*53ee8cc1Swenshuai.xi 
923*53ee8cc1Swenshuai.xi 
924*53ee8cc1Swenshuai.xi /* Functions for handling conditional variables.  */
925*53ee8cc1Swenshuai.xi 
926*53ee8cc1Swenshuai.xi /* Initialize condition variable COND using attributes ATTR, or use
927*53ee8cc1Swenshuai.xi    the default values if later is NULL.  */
928*53ee8cc1Swenshuai.xi extern int pthread_cond_init (pthread_cond_t *__restrict __cond,
929*53ee8cc1Swenshuai.xi 			      __const pthread_condattr_t *__restrict
930*53ee8cc1Swenshuai.xi 			      __cond_attr) __THROW __nonnull ((1));
931*53ee8cc1Swenshuai.xi 
932*53ee8cc1Swenshuai.xi /* Destroy condition variable COND.  */
933*53ee8cc1Swenshuai.xi extern int pthread_cond_destroy (pthread_cond_t *__cond)
934*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
935*53ee8cc1Swenshuai.xi 
936*53ee8cc1Swenshuai.xi /* Wake up one thread waiting for condition variable COND.  */
937*53ee8cc1Swenshuai.xi extern int pthread_cond_signal (pthread_cond_t *__cond)
938*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
939*53ee8cc1Swenshuai.xi 
940*53ee8cc1Swenshuai.xi /* Wake up all threads waiting for condition variables COND.  */
941*53ee8cc1Swenshuai.xi extern int pthread_cond_broadcast (pthread_cond_t *__cond)
942*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
943*53ee8cc1Swenshuai.xi 
944*53ee8cc1Swenshuai.xi /* Wait for condition variable COND to be signaled or broadcast.
945*53ee8cc1Swenshuai.xi    MUTEX is assumed to be locked before.
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi    This function is a cancellation point and therefore not marked with
948*53ee8cc1Swenshuai.xi    __THROW.  */
949*53ee8cc1Swenshuai.xi extern int pthread_cond_wait (pthread_cond_t *__restrict __cond,
950*53ee8cc1Swenshuai.xi 			      pthread_mutex_t *__restrict __mutex)
951*53ee8cc1Swenshuai.xi      __nonnull ((1, 2));
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi /* Wait for condition variable COND to be signaled or broadcast until
954*53ee8cc1Swenshuai.xi    ABSTIME.  MUTEX is assumed to be locked before.  ABSTIME is an
955*53ee8cc1Swenshuai.xi    absolute time specification; zero is the beginning of the epoch
956*53ee8cc1Swenshuai.xi    (00:00:00 GMT, January 1, 1970).
957*53ee8cc1Swenshuai.xi 
958*53ee8cc1Swenshuai.xi    This function is a cancellation point and therefore not marked with
959*53ee8cc1Swenshuai.xi    __THROW.  */
960*53ee8cc1Swenshuai.xi extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond,
961*53ee8cc1Swenshuai.xi 				   pthread_mutex_t *__restrict __mutex,
962*53ee8cc1Swenshuai.xi 				   __const struct timespec *__restrict
963*53ee8cc1Swenshuai.xi 				   __abstime) __nonnull ((1, 2, 3));
964*53ee8cc1Swenshuai.xi 
965*53ee8cc1Swenshuai.xi /* Functions for handling condition variable attributes.  */
966*53ee8cc1Swenshuai.xi 
967*53ee8cc1Swenshuai.xi /* Initialize condition variable attribute ATTR.  */
968*53ee8cc1Swenshuai.xi extern int pthread_condattr_init (pthread_condattr_t *__attr)
969*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
970*53ee8cc1Swenshuai.xi 
971*53ee8cc1Swenshuai.xi /* Destroy condition variable attribute ATTR.  */
972*53ee8cc1Swenshuai.xi extern int pthread_condattr_destroy (pthread_condattr_t *__attr)
973*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
974*53ee8cc1Swenshuai.xi 
975*53ee8cc1Swenshuai.xi /* Get the process-shared flag of the condition variable attribute ATTR.  */
976*53ee8cc1Swenshuai.xi extern int pthread_condattr_getpshared (__const pthread_condattr_t *
977*53ee8cc1Swenshuai.xi                                         __restrict __attr,
978*53ee8cc1Swenshuai.xi                                         int *__restrict __pshared)
979*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
980*53ee8cc1Swenshuai.xi 
981*53ee8cc1Swenshuai.xi /* Set the process-shared flag of the condition variable attribute ATTR.  */
982*53ee8cc1Swenshuai.xi extern int pthread_condattr_setpshared (pthread_condattr_t *__attr,
983*53ee8cc1Swenshuai.xi                                         int __pshared) __THROW __nonnull ((1));
984*53ee8cc1Swenshuai.xi 
985*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
986*53ee8cc1Swenshuai.xi /* Get the clock selected for the conditon variable attribute ATTR.  */
987*53ee8cc1Swenshuai.xi extern int pthread_condattr_getclock (__const pthread_condattr_t *
988*53ee8cc1Swenshuai.xi 				      __restrict __attr,
989*53ee8cc1Swenshuai.xi 				      __clockid_t *__restrict __clock_id)
990*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
991*53ee8cc1Swenshuai.xi 
992*53ee8cc1Swenshuai.xi /* Set the clock selected for the conditon variable attribute ATTR.  */
993*53ee8cc1Swenshuai.xi extern int pthread_condattr_setclock (pthread_condattr_t *__attr,
994*53ee8cc1Swenshuai.xi 				      __clockid_t __clock_id)
995*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
996*53ee8cc1Swenshuai.xi #endif
997*53ee8cc1Swenshuai.xi 
998*53ee8cc1Swenshuai.xi 
999*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
1000*53ee8cc1Swenshuai.xi /* Functions to handle spinlocks.  */
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi /* Initialize the spinlock LOCK.  If PSHARED is nonzero the spinlock can
1003*53ee8cc1Swenshuai.xi    be shared between different processes.  */
1004*53ee8cc1Swenshuai.xi extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared)
1005*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1006*53ee8cc1Swenshuai.xi 
1007*53ee8cc1Swenshuai.xi /* Destroy the spinlock LOCK.  */
1008*53ee8cc1Swenshuai.xi extern int pthread_spin_destroy (pthread_spinlock_t *__lock)
1009*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi /* Wait until spinlock LOCK is retrieved.  */
1012*53ee8cc1Swenshuai.xi extern int pthread_spin_lock (pthread_spinlock_t *__lock)
1013*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi /* Try to lock spinlock LOCK.  */
1016*53ee8cc1Swenshuai.xi extern int pthread_spin_trylock (pthread_spinlock_t *__lock)
1017*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1018*53ee8cc1Swenshuai.xi 
1019*53ee8cc1Swenshuai.xi /* Release spinlock LOCK.  */
1020*53ee8cc1Swenshuai.xi extern int pthread_spin_unlock (pthread_spinlock_t *__lock)
1021*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1022*53ee8cc1Swenshuai.xi 
1023*53ee8cc1Swenshuai.xi 
1024*53ee8cc1Swenshuai.xi /* Functions to handle barriers.  */
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi /* Initialize BARRIER with the attributes in ATTR.  The barrier is
1027*53ee8cc1Swenshuai.xi    opened when COUNT waiters arrived.  */
1028*53ee8cc1Swenshuai.xi extern int pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
1029*53ee8cc1Swenshuai.xi 				 __const pthread_barrierattr_t *__restrict
1030*53ee8cc1Swenshuai.xi 				 __attr, unsigned int __count)
1031*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1032*53ee8cc1Swenshuai.xi 
1033*53ee8cc1Swenshuai.xi /* Destroy a previously dynamically initialized barrier BARRIER.  */
1034*53ee8cc1Swenshuai.xi extern int pthread_barrier_destroy (pthread_barrier_t *__barrier)
1035*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1036*53ee8cc1Swenshuai.xi 
1037*53ee8cc1Swenshuai.xi /* Wait on barrier BARRIER.  */
1038*53ee8cc1Swenshuai.xi extern int pthread_barrier_wait (pthread_barrier_t *__barrier)
1039*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1040*53ee8cc1Swenshuai.xi 
1041*53ee8cc1Swenshuai.xi 
1042*53ee8cc1Swenshuai.xi /* Initialize barrier attribute ATTR.  */
1043*53ee8cc1Swenshuai.xi extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr)
1044*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1045*53ee8cc1Swenshuai.xi 
1046*53ee8cc1Swenshuai.xi /* Destroy previously dynamically initialized barrier attribute ATTR.  */
1047*53ee8cc1Swenshuai.xi extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr)
1048*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1049*53ee8cc1Swenshuai.xi 
1050*53ee8cc1Swenshuai.xi /* Get the process-shared flag of the barrier attribute ATTR.  */
1051*53ee8cc1Swenshuai.xi extern int pthread_barrierattr_getpshared (__const pthread_barrierattr_t *
1052*53ee8cc1Swenshuai.xi 					   __restrict __attr,
1053*53ee8cc1Swenshuai.xi 					   int *__restrict __pshared)
1054*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1, 2));
1055*53ee8cc1Swenshuai.xi 
1056*53ee8cc1Swenshuai.xi /* Set the process-shared flag of the barrier attribute ATTR.  */
1057*53ee8cc1Swenshuai.xi extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr,
1058*53ee8cc1Swenshuai.xi                                            int __pshared)
1059*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1060*53ee8cc1Swenshuai.xi #endif
1061*53ee8cc1Swenshuai.xi 
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi /* Functions for handling thread-specific data.  */
1064*53ee8cc1Swenshuai.xi 
1065*53ee8cc1Swenshuai.xi /* Create a key value identifying a location in the thread-specific
1066*53ee8cc1Swenshuai.xi    data area.  Each thread maintains a distinct thread-specific data
1067*53ee8cc1Swenshuai.xi    area.  DESTR_FUNCTION, if non-NULL, is called with the value
1068*53ee8cc1Swenshuai.xi    associated to that key when the key is destroyed.
1069*53ee8cc1Swenshuai.xi    DESTR_FUNCTION is not called if the value associated is NULL when
1070*53ee8cc1Swenshuai.xi    the key is destroyed.  */
1071*53ee8cc1Swenshuai.xi extern int pthread_key_create (pthread_key_t *__key,
1072*53ee8cc1Swenshuai.xi 			       void (*__destr_function) (void *))
1073*53ee8cc1Swenshuai.xi      __THROW __nonnull ((1));
1074*53ee8cc1Swenshuai.xi 
1075*53ee8cc1Swenshuai.xi /* Destroy KEY.  */
1076*53ee8cc1Swenshuai.xi extern int pthread_key_delete (pthread_key_t __key) __THROW;
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi /* Return current value of the thread-specific data slot identified by KEY.  */
1079*53ee8cc1Swenshuai.xi extern void *pthread_getspecific (pthread_key_t __key) __THROW;
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi /* Store POINTER in the thread-specific data slot identified by KEY. */
1082*53ee8cc1Swenshuai.xi extern int pthread_setspecific (pthread_key_t __key,
1083*53ee8cc1Swenshuai.xi 				__const void *__pointer) __THROW ;
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi 
1086*53ee8cc1Swenshuai.xi #ifdef __USE_XOPEN2K
1087*53ee8cc1Swenshuai.xi /* Get ID of CPU-time clock for thread THREAD_ID.  */
1088*53ee8cc1Swenshuai.xi extern int pthread_getcpuclockid (pthread_t __thread_id,
1089*53ee8cc1Swenshuai.xi 				  __clockid_t *__clock_id)
1090*53ee8cc1Swenshuai.xi      __THROW __nonnull ((2));
1091*53ee8cc1Swenshuai.xi #endif
1092*53ee8cc1Swenshuai.xi 
1093*53ee8cc1Swenshuai.xi 
1094*53ee8cc1Swenshuai.xi /* Install handlers to be called when a new process is created with FORK.
1095*53ee8cc1Swenshuai.xi    The PREPARE handler is called in the parent process just before performing
1096*53ee8cc1Swenshuai.xi    FORK. The PARENT handler is called in the parent process just after FORK.
1097*53ee8cc1Swenshuai.xi    The CHILD handler is called in the child process.  Each of the three
1098*53ee8cc1Swenshuai.xi    handlers can be NULL, meaning that no handler needs to be called at that
1099*53ee8cc1Swenshuai.xi    point.
1100*53ee8cc1Swenshuai.xi    PTHREAD_ATFORK can be called several times, in which case the PREPARE
1101*53ee8cc1Swenshuai.xi    handlers are called in LIFO order (last added with PTHREAD_ATFORK,
1102*53ee8cc1Swenshuai.xi    first called before FORK), and the PARENT and CHILD handlers are called
1103*53ee8cc1Swenshuai.xi    in FIFO (first added, first called).  */
1104*53ee8cc1Swenshuai.xi 
1105*53ee8cc1Swenshuai.xi extern int pthread_atfork (void (*__prepare) (void),
1106*53ee8cc1Swenshuai.xi 			   void (*__parent) (void),
1107*53ee8cc1Swenshuai.xi 			   void (*__child) (void)) __THROW;
1108*53ee8cc1Swenshuai.xi 
1109*53ee8cc1Swenshuai.xi 
1110*53ee8cc1Swenshuai.xi #ifdef __USE_EXTERN_INLINES
1111*53ee8cc1Swenshuai.xi /* Optimizations.  */
1112*53ee8cc1Swenshuai.xi __extern_inline int
__NTH(pthread_equal (pthread_t __thread1,pthread_t __thread2))1113*53ee8cc1Swenshuai.xi __NTH (pthread_equal (pthread_t __thread1, pthread_t __thread2))
1114*53ee8cc1Swenshuai.xi {
1115*53ee8cc1Swenshuai.xi   return __thread1 == __thread2;
1116*53ee8cc1Swenshuai.xi }
1117*53ee8cc1Swenshuai.xi #endif
1118*53ee8cc1Swenshuai.xi 
1119*53ee8cc1Swenshuai.xi __END_DECLS
1120*53ee8cc1Swenshuai.xi 
1121*53ee8cc1Swenshuai.xi #endif	/* pthread.h */
1122