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