xref: /relibc/pthreads-emb/pthread.h (revision 062c5bc4dfeed2c1bed58ed4810dd27adb32c68d)
1*062c5bc4SJason Schmidlapp /* This is an implementation of the threads API of POSIX 1003.1-2001.
2*062c5bc4SJason Schmidlapp  *
3*062c5bc4SJason Schmidlapp  * --------------------------------------------------------------------------
4*062c5bc4SJason Schmidlapp  *
5*062c5bc4SJason Schmidlapp  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
6*062c5bc4SJason Schmidlapp  *      Copyright(C) 2008 Jason Schmidlapp
7*062c5bc4SJason Schmidlapp  *
8*062c5bc4SJason Schmidlapp  *      Contact Email: jschmidlapp@users.sourceforge.net
9*062c5bc4SJason Schmidlapp  *
10*062c5bc4SJason Schmidlapp  *
11*062c5bc4SJason Schmidlapp  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
12*062c5bc4SJason Schmidlapp  *      Copyright(C) 2008 Jason Schmidlapp
13*062c5bc4SJason Schmidlapp  *
14*062c5bc4SJason Schmidlapp  *      Contact Email: jschmidlapp@users.sourceforge.net
15*062c5bc4SJason Schmidlapp  *
16*062c5bc4SJason Schmidlapp  *
17*062c5bc4SJason Schmidlapp  *      Based upon Pthreads-win32 - POSIX Threads Library for Win32
18*062c5bc4SJason Schmidlapp  *      Copyright(C) 1998 John E. Bossom
19*062c5bc4SJason Schmidlapp  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
20*062c5bc4SJason Schmidlapp  *
21*062c5bc4SJason Schmidlapp  *      Contact Email: rpj@callisto.canberra.edu.au
22*062c5bc4SJason Schmidlapp  *
23*062c5bc4SJason Schmidlapp  *      The original list of contributors to the Pthreads-win32 project
24*062c5bc4SJason Schmidlapp  *      is contained in the file CONTRIBUTORS.ptw32 included with the
25*062c5bc4SJason Schmidlapp  *      source code distribution. The list can also be seen at the
26*062c5bc4SJason Schmidlapp  *      following World Wide Web location:
27*062c5bc4SJason Schmidlapp  *      http://sources.redhat.com/pthreads-win32/contributors.html
28*062c5bc4SJason Schmidlapp  *
29*062c5bc4SJason Schmidlapp  *      This library is free software; you can redistribute it and/or
30*062c5bc4SJason Schmidlapp  *      modify it under the terms of the GNU Lesser General Public
31*062c5bc4SJason Schmidlapp  *      License as published by the Free Software Foundation; either
32*062c5bc4SJason Schmidlapp  *      version 2 of the License, or (at your option) any later version.
33*062c5bc4SJason Schmidlapp  *
34*062c5bc4SJason Schmidlapp  *      This library is distributed in the hope that it will be useful,
35*062c5bc4SJason Schmidlapp  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
36*062c5bc4SJason Schmidlapp  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
37*062c5bc4SJason Schmidlapp  *      Lesser General Public License for more details.
38*062c5bc4SJason Schmidlapp  *
39*062c5bc4SJason Schmidlapp  *      You should have received a copy of the GNU Lesser General Public
40*062c5bc4SJason Schmidlapp  *      License along with this library in the file COPYING.LIB;
41*062c5bc4SJason Schmidlapp  *      if not, write to the Free Software Foundation, Inc.,
42*062c5bc4SJason Schmidlapp  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
43*062c5bc4SJason Schmidlapp  */
44*062c5bc4SJason Schmidlapp #if !defined( PTHREAD_H )
45*062c5bc4SJason Schmidlapp #define PTHREAD_H
46*062c5bc4SJason Schmidlapp 
47*062c5bc4SJason Schmidlapp #include <pte-config.h>
48*062c5bc4SJason Schmidlapp 
49*062c5bc4SJason Schmidlapp #include <sched.h>
50*062c5bc4SJason Schmidlapp 
51*062c5bc4SJason Schmidlapp #define PTE_VERSION 2,8,0,0
52*062c5bc4SJason Schmidlapp #define PTE_VERSION_STRING "2, 8, 0, 0\0"
53*062c5bc4SJason Schmidlapp 
54*062c5bc4SJason Schmidlapp /* There are two implementations of cancel cleanup.
55*062c5bc4SJason Schmidlapp  * Note that pthread.h is included in both application
56*062c5bc4SJason Schmidlapp  * compilation units and also internally for the library.
57*062c5bc4SJason Schmidlapp  * The code here and within the library aims to work
58*062c5bc4SJason Schmidlapp  * for all reasonable combinations of environments.
59*062c5bc4SJason Schmidlapp  *
60*062c5bc4SJason Schmidlapp  * The two implementations are:
61*062c5bc4SJason Schmidlapp  *
62*062c5bc4SJason Schmidlapp  *   C
63*062c5bc4SJason Schmidlapp  *   C++
64*062c5bc4SJason Schmidlapp  *
65*062c5bc4SJason Schmidlapp  */
66*062c5bc4SJason Schmidlapp 
67*062c5bc4SJason Schmidlapp /*
68*062c5bc4SJason Schmidlapp  * Define defaults for cleanup code.
69*062c5bc4SJason Schmidlapp  * Note: Unless the build explicitly defines one of the following, then
70*062c5bc4SJason Schmidlapp  * we default to standard C style cleanup. This style uses setjmp/longjmp
71*062c5bc4SJason Schmidlapp  * in the cancelation and thread exit implementations and therefore won't
72*062c5bc4SJason Schmidlapp  * do stack unwinding if linked to applications that have it (e.g.
73*062c5bc4SJason Schmidlapp  * C++ apps). This is currently consistent with most/all commercial Unix
74*062c5bc4SJason Schmidlapp  * POSIX threads implementations.
75*062c5bc4SJason Schmidlapp  */
76*062c5bc4SJason Schmidlapp #if !defined( PTE_CLEANUP_CXX ) && !defined( PTE_CLEANUP_C )
77*062c5bc4SJason Schmidlapp # define PTE_CLEANUP_C
78*062c5bc4SJason Schmidlapp #endif
79*062c5bc4SJason Schmidlapp 
80*062c5bc4SJason Schmidlapp #undef PTE_LEVEL
81*062c5bc4SJason Schmidlapp 
82*062c5bc4SJason Schmidlapp #if defined(_POSIX_SOURCE)
83*062c5bc4SJason Schmidlapp #define PTE_LEVEL 0
84*062c5bc4SJason Schmidlapp /* Early POSIX */
85*062c5bc4SJason Schmidlapp #endif
86*062c5bc4SJason Schmidlapp 
87*062c5bc4SJason Schmidlapp #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
88*062c5bc4SJason Schmidlapp #undef PTE_LEVEL
89*062c5bc4SJason Schmidlapp #define PTE_LEVEL 1
90*062c5bc4SJason Schmidlapp /* Include 1b, 1c and 1d */
91*062c5bc4SJason Schmidlapp #endif
92*062c5bc4SJason Schmidlapp 
93*062c5bc4SJason Schmidlapp #if defined(INCLUDE_NP)
94*062c5bc4SJason Schmidlapp #undef PTE_LEVEL
95*062c5bc4SJason Schmidlapp #define PTE_LEVEL 2
96*062c5bc4SJason Schmidlapp /* Include Non-Portable extensions */
97*062c5bc4SJason Schmidlapp #endif
98*062c5bc4SJason Schmidlapp 
99*062c5bc4SJason Schmidlapp #define PTE_LEVEL_MAX 3
100*062c5bc4SJason Schmidlapp 
101*062c5bc4SJason Schmidlapp #if !defined(PTE_LEVEL)
102*062c5bc4SJason Schmidlapp #define PTE_LEVEL PTE_LEVEL_MAX
103*062c5bc4SJason Schmidlapp /* Include everything */
104*062c5bc4SJason Schmidlapp #endif
105*062c5bc4SJason Schmidlapp 
106*062c5bc4SJason Schmidlapp /*
107*062c5bc4SJason Schmidlapp  * -------------------------------------------------------------
108*062c5bc4SJason Schmidlapp  *
109*062c5bc4SJason Schmidlapp  *
110*062c5bc4SJason Schmidlapp  * Module: pthread.h
111*062c5bc4SJason Schmidlapp  *
112*062c5bc4SJason Schmidlapp  * Purpose:
113*062c5bc4SJason Schmidlapp  *      Provides an implementation of PThreads based upon the
114*062c5bc4SJason Schmidlapp  *      standard:
115*062c5bc4SJason Schmidlapp  *
116*062c5bc4SJason Schmidlapp  *              POSIX 1003.1-2001
117*062c5bc4SJason Schmidlapp  *  and
118*062c5bc4SJason Schmidlapp  *    The Single Unix Specification version 3
119*062c5bc4SJason Schmidlapp  *
120*062c5bc4SJason Schmidlapp  *    (these two are equivalent)
121*062c5bc4SJason Schmidlapp  *
122*062c5bc4SJason Schmidlapp  *      in order to enhance code portability between Windows,
123*062c5bc4SJason Schmidlapp  *  various commercial Unix implementations, and Linux.
124*062c5bc4SJason Schmidlapp  *
125*062c5bc4SJason Schmidlapp  *      See the ANNOUNCE file for a full list of conforming
126*062c5bc4SJason Schmidlapp  *      routines and defined constants, and a list of missing
127*062c5bc4SJason Schmidlapp  *      routines and constants not defined in this implementation.
128*062c5bc4SJason Schmidlapp  *
129*062c5bc4SJason Schmidlapp  * Authors:
130*062c5bc4SJason Schmidlapp  *      There have been many contributors to this library.
131*062c5bc4SJason Schmidlapp  *      The initial implementation was contributed by
132*062c5bc4SJason Schmidlapp  *      John Bossom, and several others have provided major
133*062c5bc4SJason Schmidlapp  *      sections or revisions of parts of the implementation.
134*062c5bc4SJason Schmidlapp  *      Often significant effort has been contributed to
135*062c5bc4SJason Schmidlapp  *      find and fix important bugs and other problems to
136*062c5bc4SJason Schmidlapp  *      improve the reliability of the library, which sometimes
137*062c5bc4SJason Schmidlapp  *      is not reflected in the amount of code which changed as
138*062c5bc4SJason Schmidlapp  *      result.
139*062c5bc4SJason Schmidlapp  *      As much as possible, the contributors are acknowledged
140*062c5bc4SJason Schmidlapp  *      in the ChangeLog file in the source code distribution
141*062c5bc4SJason Schmidlapp  *      where their changes are noted in detail.
142*062c5bc4SJason Schmidlapp  *
143*062c5bc4SJason Schmidlapp  *      Contributors are listed in the CONTRIBUTORS file.
144*062c5bc4SJason Schmidlapp  *
145*062c5bc4SJason Schmidlapp  *      As usual, all bouquets go to the contributors, and all
146*062c5bc4SJason Schmidlapp  *      brickbats go to the project maintainer.
147*062c5bc4SJason Schmidlapp  *
148*062c5bc4SJason Schmidlapp  * Maintainer:
149*062c5bc4SJason Schmidlapp  *      The code base for this project is coordinated and
150*062c5bc4SJason Schmidlapp  *      eventually pre-tested, packaged, and made available by
151*062c5bc4SJason Schmidlapp  *
152*062c5bc4SJason Schmidlapp  *              Ross Johnson <rpj@callisto.canberra.edu.au>
153*062c5bc4SJason Schmidlapp  *
154*062c5bc4SJason Schmidlapp  * QA Testers:
155*062c5bc4SJason Schmidlapp  *      Ultimately, the library is tested in the real world by
156*062c5bc4SJason Schmidlapp  *      a host of competent and demanding scientists and
157*062c5bc4SJason Schmidlapp  *      engineers who report bugs and/or provide solutions
158*062c5bc4SJason Schmidlapp  *      which are then fixed or incorporated into subsequent
159*062c5bc4SJason Schmidlapp  *      versions of the library. Each time a bug is fixed, a
160*062c5bc4SJason Schmidlapp  *      test case is written to prove the fix and ensure
161*062c5bc4SJason Schmidlapp  *      that later changes to the code don't reintroduce the
162*062c5bc4SJason Schmidlapp  *      same error. The number of test cases is slowly growing
163*062c5bc4SJason Schmidlapp  *      and therefore so is the code reliability.
164*062c5bc4SJason Schmidlapp  *
165*062c5bc4SJason Schmidlapp  * Compliance:
166*062c5bc4SJason Schmidlapp  *      See the file ANNOUNCE for the list of implemented
167*062c5bc4SJason Schmidlapp  *      and not-implemented routines and defined options.
168*062c5bc4SJason Schmidlapp  *      Of course, these are all defined is this file as well.
169*062c5bc4SJason Schmidlapp  *
170*062c5bc4SJason Schmidlapp  * Web site:
171*062c5bc4SJason Schmidlapp  *      The source code and other information about this library
172*062c5bc4SJason Schmidlapp  *      are available from
173*062c5bc4SJason Schmidlapp  *
174*062c5bc4SJason Schmidlapp  *              http://sources.redhat.com/pthreads-win32/
175*062c5bc4SJason Schmidlapp  *
176*062c5bc4SJason Schmidlapp  * -------------------------------------------------------------
177*062c5bc4SJason Schmidlapp  */
178*062c5bc4SJason Schmidlapp 
179*062c5bc4SJason Schmidlapp #include <time.h>
180*062c5bc4SJason Schmidlapp 
181*062c5bc4SJason Schmidlapp #include <setjmp.h>
182*062c5bc4SJason Schmidlapp #include <limits.h>
183*062c5bc4SJason Schmidlapp 
184*062c5bc4SJason Schmidlapp /*
185*062c5bc4SJason Schmidlapp  * Boolean values to make us independent of system includes.
186*062c5bc4SJason Schmidlapp  */
187*062c5bc4SJason Schmidlapp enum
188*062c5bc4SJason Schmidlapp {
189*062c5bc4SJason Schmidlapp   PTE_FALSE = 0,
190*062c5bc4SJason Schmidlapp   PTE_TRUE = (! PTE_FALSE)
191*062c5bc4SJason Schmidlapp };
192*062c5bc4SJason Schmidlapp 
193*062c5bc4SJason Schmidlapp 
194*062c5bc4SJason Schmidlapp     /*
195*062c5bc4SJason Schmidlapp      * -------------------------------------------------------------
196*062c5bc4SJason Schmidlapp      *
197*062c5bc4SJason Schmidlapp      * POSIX 1003.1-2001 Options
198*062c5bc4SJason Schmidlapp      * =========================
199*062c5bc4SJason Schmidlapp      *
200*062c5bc4SJason Schmidlapp      * Options are normally set in <unistd.h>, which is not provided
201*062c5bc4SJason Schmidlapp      * with pthreads-embedded.
202*062c5bc4SJason Schmidlapp      *
203*062c5bc4SJason Schmidlapp      * For conformance with the Single Unix Specification (version 3), all of the
204*062c5bc4SJason Schmidlapp      * options below are defined, and have a value of either -1 (not supported)
205*062c5bc4SJason Schmidlapp      * or 200112L (supported).
206*062c5bc4SJason Schmidlapp      *
207*062c5bc4SJason Schmidlapp      * These options can neither be left undefined nor have a value of 0, because
208*062c5bc4SJason Schmidlapp      * either indicates that sysconf(), which is not implemented, may be used at
209*062c5bc4SJason Schmidlapp      * runtime to check the status of the option.
210*062c5bc4SJason Schmidlapp      *
211*062c5bc4SJason Schmidlapp      * _POSIX_THREADS (== 200112L)
212*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use threads
213*062c5bc4SJason Schmidlapp      *
214*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L)
215*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can control the size of a thread's
216*062c5bc4SJason Schmidlapp      *                      stack
217*062c5bc4SJason Schmidlapp      *                              pthread_attr_getstacksize
218*062c5bc4SJason Schmidlapp      *                              pthread_attr_setstacksize
219*062c5bc4SJason Schmidlapp      *
220*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_ATTR_STACKADDR (== -1)
221*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can allocate and control a thread's
222*062c5bc4SJason Schmidlapp      *                      stack. If not supported, the following functions
223*062c5bc4SJason Schmidlapp      *                      will return ENOSYS, indicating they are not
224*062c5bc4SJason Schmidlapp      *                      supported:
225*062c5bc4SJason Schmidlapp      *                              pthread_attr_getstackaddr
226*062c5bc4SJason Schmidlapp      *                              pthread_attr_setstackaddr
227*062c5bc4SJason Schmidlapp      *
228*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1)
229*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use realtime scheduling.
230*062c5bc4SJason Schmidlapp      *                      This option indicates that the behaviour of some
231*062c5bc4SJason Schmidlapp      *                      implemented functions conforms to the additional TPS
232*062c5bc4SJason Schmidlapp      *                      requirements in the standard. E.g. rwlocks favour
233*062c5bc4SJason Schmidlapp      *                      writers over readers when threads have equal priority.
234*062c5bc4SJason Schmidlapp      *
235*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PRIO_INHERIT (== -1)
236*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can create priority inheritance
237*062c5bc4SJason Schmidlapp      *                      mutexes.
238*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getprotocol +
239*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setprotocol +
240*062c5bc4SJason Schmidlapp      *
241*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PRIO_PROTECT (== -1)
242*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can create priority ceiling mutexes
243*062c5bc4SJason Schmidlapp      *                      Indicates the availability of:
244*062c5bc4SJason Schmidlapp      *                              pthread_mutex_getprioceiling
245*062c5bc4SJason Schmidlapp      *                              pthread_mutex_setprioceiling
246*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getprioceiling
247*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getprotocol     +
248*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setprioceiling
249*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setprotocol     +
250*062c5bc4SJason Schmidlapp      *
251*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PROCESS_SHARED (== -1)
252*062c5bc4SJason Schmidlapp      *                      If set, you can create mutexes and condition
253*062c5bc4SJason Schmidlapp      *                      variables that can be shared with another
254*062c5bc4SJason Schmidlapp      *                      process.If set, indicates the availability
255*062c5bc4SJason Schmidlapp      *                      of:
256*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getpshared
257*062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setpshared
258*062c5bc4SJason Schmidlapp      *                              pthread_condattr_getpshared
259*062c5bc4SJason Schmidlapp      *                              pthread_condattr_setpshared
260*062c5bc4SJason Schmidlapp      *
261*062c5bc4SJason Schmidlapp      * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L)
262*062c5bc4SJason Schmidlapp      *                      If == 200112L you can use the special *_r library
263*062c5bc4SJason Schmidlapp      *                      functions that provide thread-safe behaviour
264*062c5bc4SJason Schmidlapp      *
265*062c5bc4SJason Schmidlapp      * _POSIX_READER_WRITER_LOCKS (== 200112L)
266*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use read/write locks
267*062c5bc4SJason Schmidlapp      *
268*062c5bc4SJason Schmidlapp      * _POSIX_SPIN_LOCKS (== 200112L)
269*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use spin locks
270*062c5bc4SJason Schmidlapp      *
271*062c5bc4SJason Schmidlapp      * _POSIX_BARRIERS (== 200112L)
272*062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use barriers
273*062c5bc4SJason Schmidlapp      *
274*062c5bc4SJason Schmidlapp      *      + These functions provide both 'inherit' and/or
275*062c5bc4SJason Schmidlapp      *        'protect' protocol, based upon these macro
276*062c5bc4SJason Schmidlapp      *        settings.
277*062c5bc4SJason Schmidlapp      *
278*062c5bc4SJason Schmidlapp      * -------------------------------------------------------------
279*062c5bc4SJason Schmidlapp      */
280*062c5bc4SJason Schmidlapp 
281*062c5bc4SJason Schmidlapp     /*
282*062c5bc4SJason Schmidlapp      * POSIX Options
283*062c5bc4SJason Schmidlapp      */
284*062c5bc4SJason Schmidlapp #undef _POSIX_THREADS
285*062c5bc4SJason Schmidlapp #define _POSIX_THREADS 200112L
286*062c5bc4SJason Schmidlapp 
287*062c5bc4SJason Schmidlapp #undef _POSIX_READER_WRITER_LOCKS
288*062c5bc4SJason Schmidlapp #define _POSIX_READER_WRITER_LOCKS 200112L
289*062c5bc4SJason Schmidlapp 
290*062c5bc4SJason Schmidlapp #undef _POSIX_SPIN_LOCKS
291*062c5bc4SJason Schmidlapp #define _POSIX_SPIN_LOCKS 200112L
292*062c5bc4SJason Schmidlapp 
293*062c5bc4SJason Schmidlapp #undef _POSIX_BARRIERS
294*062c5bc4SJason Schmidlapp #define _POSIX_BARRIERS 200112L
295*062c5bc4SJason Schmidlapp 
296*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_SAFE_FUNCTIONS
297*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
298*062c5bc4SJason Schmidlapp 
299*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_ATTR_STACKSIZE
300*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_ATTR_STACKSIZE 200112L
301*062c5bc4SJason Schmidlapp 
302*062c5bc4SJason Schmidlapp     /*
303*062c5bc4SJason Schmidlapp      * The following options are not supported
304*062c5bc4SJason Schmidlapp      */
305*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_ATTR_STACKADDR
306*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_ATTR_STACKADDR -1
307*062c5bc4SJason Schmidlapp 
308*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PRIO_INHERIT
309*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PRIO_INHERIT -1
310*062c5bc4SJason Schmidlapp 
311*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PRIO_PROTECT
312*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PRIO_PROTECT -1
313*062c5bc4SJason Schmidlapp 
314*062c5bc4SJason Schmidlapp     /* TPS is not fully supported.  */
315*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PRIORITY_SCHEDULING
316*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PRIORITY_SCHEDULING -1
317*062c5bc4SJason Schmidlapp 
318*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PROCESS_SHARED
319*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PROCESS_SHARED -1
320*062c5bc4SJason Schmidlapp 
321*062c5bc4SJason Schmidlapp 
322*062c5bc4SJason Schmidlapp     /*
323*062c5bc4SJason Schmidlapp      * POSIX 1003.1-2001 Limits
324*062c5bc4SJason Schmidlapp      * ===========================
325*062c5bc4SJason Schmidlapp      *
326*062c5bc4SJason Schmidlapp      * These limits are normally set in <limits.h>, which is not provided with
327*062c5bc4SJason Schmidlapp      * pthreads-embedded.
328*062c5bc4SJason Schmidlapp      *
329*062c5bc4SJason Schmidlapp      * PTHREAD_DESTRUCTOR_ITERATIONS
330*062c5bc4SJason Schmidlapp      *                      Maximum number of attempts to destroy
331*062c5bc4SJason Schmidlapp      *                      a thread's thread-specific data on
332*062c5bc4SJason Schmidlapp      *                      termination (must be at least 4)
333*062c5bc4SJason Schmidlapp      *
334*062c5bc4SJason Schmidlapp      * PTHREAD_KEYS_MAX
335*062c5bc4SJason Schmidlapp      *                      Maximum number of thread-specific data keys
336*062c5bc4SJason Schmidlapp      *                      available per process (must be at least 128)
337*062c5bc4SJason Schmidlapp      *
338*062c5bc4SJason Schmidlapp      * PTHREAD_STACK_MIN
339*062c5bc4SJason Schmidlapp      *                      Minimum supported stack size for a thread
340*062c5bc4SJason Schmidlapp      *
341*062c5bc4SJason Schmidlapp      * PTHREAD_THREADS_MAX
342*062c5bc4SJason Schmidlapp      *                      Maximum number of threads supported per
343*062c5bc4SJason Schmidlapp      *                      process (must be at least 64).
344*062c5bc4SJason Schmidlapp      *
345*062c5bc4SJason Schmidlapp      * SEM_NSEMS_MAX
346*062c5bc4SJason Schmidlapp      *                      The maximum number of semaphores a process can have.
347*062c5bc4SJason Schmidlapp      *                      (must be at least 256)
348*062c5bc4SJason Schmidlapp      *
349*062c5bc4SJason Schmidlapp      * SEM_VALUE_MAX
350*062c5bc4SJason Schmidlapp      *                      The maximum value a semaphore can have.
351*062c5bc4SJason Schmidlapp      *                      (must be at least 32767)
352*062c5bc4SJason Schmidlapp      *
353*062c5bc4SJason Schmidlapp      */
354*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
355*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_DESTRUCTOR_ITERATIONS     4
356*062c5bc4SJason Schmidlapp 
357*062c5bc4SJason Schmidlapp #undef PTHREAD_DESTRUCTOR_ITERATIONS
358*062c5bc4SJason Schmidlapp #define PTHREAD_DESTRUCTOR_ITERATIONS           _POSIX_THREAD_DESTRUCTOR_ITERATIONS
359*062c5bc4SJason Schmidlapp 
360*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_KEYS_MAX
361*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_KEYS_MAX                  128
362*062c5bc4SJason Schmidlapp 
363*062c5bc4SJason Schmidlapp #undef PTHREAD_KEYS_MAX
364*062c5bc4SJason Schmidlapp #define PTHREAD_KEYS_MAX                        _POSIX_THREAD_KEYS_MAX
365*062c5bc4SJason Schmidlapp 
366*062c5bc4SJason Schmidlapp #undef PTHREAD_STACK_MIN
367*062c5bc4SJason Schmidlapp #define PTHREAD_STACK_MIN                       0
368*062c5bc4SJason Schmidlapp 
369*062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_THREADS_MAX
370*062c5bc4SJason Schmidlapp #define _POSIX_THREAD_THREADS_MAX               64
371*062c5bc4SJason Schmidlapp 
372*062c5bc4SJason Schmidlapp     /* Arbitrary value */
373*062c5bc4SJason Schmidlapp #undef PTHREAD_THREADS_MAX
374*062c5bc4SJason Schmidlapp #define PTHREAD_THREADS_MAX                     2019
375*062c5bc4SJason Schmidlapp 
376*062c5bc4SJason Schmidlapp #undef _POSIX_SEM_NSEMS_MAX
377*062c5bc4SJason Schmidlapp #define _POSIX_SEM_NSEMS_MAX                    256
378*062c5bc4SJason Schmidlapp 
379*062c5bc4SJason Schmidlapp     /* Arbitrary value */
380*062c5bc4SJason Schmidlapp #undef SEM_NSEMS_MAX
381*062c5bc4SJason Schmidlapp #define SEM_NSEMS_MAX                           1024
382*062c5bc4SJason Schmidlapp 
383*062c5bc4SJason Schmidlapp #undef _POSIX_SEM_VALUE_MAX
384*062c5bc4SJason Schmidlapp #define _POSIX_SEM_VALUE_MAX                    32767
385*062c5bc4SJason Schmidlapp 
386*062c5bc4SJason Schmidlapp #undef SEM_VALUE_MAX
387*062c5bc4SJason Schmidlapp #define SEM_VALUE_MAX                           INT_MAX
388*062c5bc4SJason Schmidlapp 
389*062c5bc4SJason Schmidlapp 
390*062c5bc4SJason Schmidlapp     /*
391*062c5bc4SJason Schmidlapp      * Generic handle type - intended to extend uniqueness beyond
392*062c5bc4SJason Schmidlapp      * that available with a simple pointer. It should scale for either
393*062c5bc4SJason Schmidlapp      * IA-32 or IA-64.
394*062c5bc4SJason Schmidlapp      */
395*062c5bc4SJason Schmidlapp     typedef struct
396*062c5bc4SJason Schmidlapp       {
397*062c5bc4SJason Schmidlapp         void * p;                   /* Pointer to actual object */
398*062c5bc4SJason Schmidlapp         unsigned int x;             /* Extra information - reuse count etc */
399*062c5bc4SJason Schmidlapp       } pte_handle_t;
400*062c5bc4SJason Schmidlapp 
401*062c5bc4SJason Schmidlapp     typedef pte_handle_t pthread_t;
402*062c5bc4SJason Schmidlapp     typedef struct pthread_attr_t_ * pthread_attr_t;
403*062c5bc4SJason Schmidlapp     typedef struct pthread_once_t_ pthread_once_t;
404*062c5bc4SJason Schmidlapp     typedef struct pthread_key_t_ * pthread_key_t;
405*062c5bc4SJason Schmidlapp     typedef struct pthread_mutex_t_ * pthread_mutex_t;
406*062c5bc4SJason Schmidlapp     typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t;
407*062c5bc4SJason Schmidlapp     typedef struct pthread_cond_t_ * pthread_cond_t;
408*062c5bc4SJason Schmidlapp     typedef struct pthread_condattr_t_ * pthread_condattr_t;
409*062c5bc4SJason Schmidlapp     typedef struct pthread_rwlock_t_ * pthread_rwlock_t;
410*062c5bc4SJason Schmidlapp     typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t;
411*062c5bc4SJason Schmidlapp     typedef struct pthread_spinlock_t_ * pthread_spinlock_t;
412*062c5bc4SJason Schmidlapp     typedef struct pthread_barrier_t_ * pthread_barrier_t;
413*062c5bc4SJason Schmidlapp     typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t;
414*062c5bc4SJason Schmidlapp 
415*062c5bc4SJason Schmidlapp     /*
416*062c5bc4SJason Schmidlapp      * ====================
417*062c5bc4SJason Schmidlapp      * ====================
418*062c5bc4SJason Schmidlapp      * POSIX Threads
419*062c5bc4SJason Schmidlapp      * ====================
420*062c5bc4SJason Schmidlapp      * ====================
421*062c5bc4SJason Schmidlapp      */
422*062c5bc4SJason Schmidlapp 
423*062c5bc4SJason Schmidlapp     enum
424*062c5bc4SJason Schmidlapp     {
425*062c5bc4SJason Schmidlapp       /*
426*062c5bc4SJason Schmidlapp        * pthread_attr_{get,set}detachstate
427*062c5bc4SJason Schmidlapp        */
428*062c5bc4SJason Schmidlapp       PTHREAD_CREATE_JOINABLE       = 0,  /* Default */
429*062c5bc4SJason Schmidlapp       PTHREAD_CREATE_DETACHED       = 1,
430*062c5bc4SJason Schmidlapp 
431*062c5bc4SJason Schmidlapp       /*
432*062c5bc4SJason Schmidlapp        * pthread_attr_{get,set}inheritsched
433*062c5bc4SJason Schmidlapp        */
434*062c5bc4SJason Schmidlapp       PTHREAD_INHERIT_SCHED         = 0,
435*062c5bc4SJason Schmidlapp       PTHREAD_EXPLICIT_SCHED        = 1,  /* Default */
436*062c5bc4SJason Schmidlapp 
437*062c5bc4SJason Schmidlapp       /*
438*062c5bc4SJason Schmidlapp        * pthread_{get,set}scope
439*062c5bc4SJason Schmidlapp        */
440*062c5bc4SJason Schmidlapp       PTHREAD_SCOPE_PROCESS         = 0,
441*062c5bc4SJason Schmidlapp       PTHREAD_SCOPE_SYSTEM          = 1,  /* Default */
442*062c5bc4SJason Schmidlapp       PTHREAD_SCOPE_PROCESS_VFPU    = 2,  /* PSP specific */
443*062c5bc4SJason Schmidlapp 
444*062c5bc4SJason Schmidlapp       /*
445*062c5bc4SJason Schmidlapp        * pthread_setcancelstate paramters
446*062c5bc4SJason Schmidlapp        */
447*062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_ENABLE         = 0,  /* Default */
448*062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_DISABLE        = 1,
449*062c5bc4SJason Schmidlapp 
450*062c5bc4SJason Schmidlapp       /*
451*062c5bc4SJason Schmidlapp        * pthread_setcanceltype parameters
452*062c5bc4SJason Schmidlapp        */
453*062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_ASYNCHRONOUS   = 0,
454*062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_DEFERRED       = 1,  /* Default */
455*062c5bc4SJason Schmidlapp 
456*062c5bc4SJason Schmidlapp       /*
457*062c5bc4SJason Schmidlapp        * pthread_mutexattr_{get,set}pshared
458*062c5bc4SJason Schmidlapp        * pthread_condattr_{get,set}pshared
459*062c5bc4SJason Schmidlapp        */
460*062c5bc4SJason Schmidlapp       PTHREAD_PROCESS_PRIVATE       = 0,
461*062c5bc4SJason Schmidlapp       PTHREAD_PROCESS_SHARED        = 1,
462*062c5bc4SJason Schmidlapp 
463*062c5bc4SJason Schmidlapp       /*
464*062c5bc4SJason Schmidlapp        * pthread_barrier_wait
465*062c5bc4SJason Schmidlapp        */
466*062c5bc4SJason Schmidlapp       PTHREAD_BARRIER_SERIAL_THREAD = -1
467*062c5bc4SJason Schmidlapp     };
468*062c5bc4SJason Schmidlapp 
469*062c5bc4SJason Schmidlapp     /*
470*062c5bc4SJason Schmidlapp      * ====================
471*062c5bc4SJason Schmidlapp      * ====================
472*062c5bc4SJason Schmidlapp      * Cancelation
473*062c5bc4SJason Schmidlapp      * ====================
474*062c5bc4SJason Schmidlapp      * ====================
475*062c5bc4SJason Schmidlapp      */
476*062c5bc4SJason Schmidlapp #define PTHREAD_CANCELED       ((void *) -1)
477*062c5bc4SJason Schmidlapp 
478*062c5bc4SJason Schmidlapp 
479*062c5bc4SJason Schmidlapp     /*
480*062c5bc4SJason Schmidlapp      * ====================
481*062c5bc4SJason Schmidlapp      * ====================
482*062c5bc4SJason Schmidlapp      * Once Key
483*062c5bc4SJason Schmidlapp      * ====================
484*062c5bc4SJason Schmidlapp      * ====================
485*062c5bc4SJason Schmidlapp      */
486*062c5bc4SJason Schmidlapp #define PTHREAD_ONCE_INIT       { PTE_FALSE, 0, 0, 0}
487*062c5bc4SJason Schmidlapp 
488*062c5bc4SJason Schmidlapp     struct pthread_once_t_
489*062c5bc4SJason Schmidlapp       {
490*062c5bc4SJason Schmidlapp         int          state;
491*062c5bc4SJason Schmidlapp         void *       semaphore;
492*062c5bc4SJason Schmidlapp         int 		   numSemaphoreUsers;
493*062c5bc4SJason Schmidlapp         int          done;        /* indicates if user function has been executed */
494*062c5bc4SJason Schmidlapp //  void *       lock;
495*062c5bc4SJason Schmidlapp //  int          reserved1;
496*062c5bc4SJason Schmidlapp //  int          reserved2;
497*062c5bc4SJason Schmidlapp       };
498*062c5bc4SJason Schmidlapp 
499*062c5bc4SJason Schmidlapp 
500*062c5bc4SJason Schmidlapp     /*
501*062c5bc4SJason Schmidlapp      * ====================
502*062c5bc4SJason Schmidlapp      * ====================
503*062c5bc4SJason Schmidlapp      * Object initialisers
504*062c5bc4SJason Schmidlapp      * ====================
505*062c5bc4SJason Schmidlapp      * ====================
506*062c5bc4SJason Schmidlapp      */
507*062c5bc4SJason Schmidlapp #define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1)
508*062c5bc4SJason Schmidlapp #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t) -2)
509*062c5bc4SJason Schmidlapp #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t) -3)
510*062c5bc4SJason Schmidlapp 
511*062c5bc4SJason Schmidlapp     /*
512*062c5bc4SJason Schmidlapp      * Compatibility with LinuxThreads
513*062c5bc4SJason Schmidlapp      */
514*062c5bc4SJason Schmidlapp #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER
515*062c5bc4SJason Schmidlapp #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER
516*062c5bc4SJason Schmidlapp 
517*062c5bc4SJason Schmidlapp #define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1)
518*062c5bc4SJason Schmidlapp 
519*062c5bc4SJason Schmidlapp #define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1)
520*062c5bc4SJason Schmidlapp 
521*062c5bc4SJason Schmidlapp #define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1)
522*062c5bc4SJason Schmidlapp 
523*062c5bc4SJason Schmidlapp 
524*062c5bc4SJason Schmidlapp     /*
525*062c5bc4SJason Schmidlapp      * Mutex types.
526*062c5bc4SJason Schmidlapp      */
527*062c5bc4SJason Schmidlapp     enum
528*062c5bc4SJason Schmidlapp     {
529*062c5bc4SJason Schmidlapp       /* Compatibility with LinuxThreads */
530*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_FAST_NP,
531*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_RECURSIVE_NP,
532*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_ERRORCHECK_NP,
533*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP,
534*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP,
535*062c5bc4SJason Schmidlapp       /* For compatibility with POSIX */
536*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP,
537*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
538*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
539*062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
540*062c5bc4SJason Schmidlapp     };
541*062c5bc4SJason Schmidlapp 
542*062c5bc4SJason Schmidlapp 
543*062c5bc4SJason Schmidlapp     typedef struct pte_cleanup_t pte_cleanup_t;
544*062c5bc4SJason Schmidlapp 
545*062c5bc4SJason Schmidlapp     typedef void (*  pte_cleanup_callback_t)(void *);
546*062c5bc4SJason Schmidlapp 
547*062c5bc4SJason Schmidlapp     struct pte_cleanup_t
548*062c5bc4SJason Schmidlapp       {
549*062c5bc4SJason Schmidlapp         pte_cleanup_callback_t routine;
550*062c5bc4SJason Schmidlapp         void *arg;
551*062c5bc4SJason Schmidlapp         struct pte_cleanup_t *prev;
552*062c5bc4SJason Schmidlapp       };
553*062c5bc4SJason Schmidlapp 
554*062c5bc4SJason Schmidlapp #ifdef PTE_CLEANUP_C
555*062c5bc4SJason Schmidlapp 
556*062c5bc4SJason Schmidlapp     /*
557*062c5bc4SJason Schmidlapp      * C implementation of PThreads cancel cleanup
558*062c5bc4SJason Schmidlapp      */
559*062c5bc4SJason Schmidlapp 
560*062c5bc4SJason Schmidlapp #define pthread_cleanup_push( _rout, _arg ) \
561*062c5bc4SJason Schmidlapp         { \
562*062c5bc4SJason Schmidlapp             pte_cleanup_t     _cleanup; \
563*062c5bc4SJason Schmidlapp             \
564*062c5bc4SJason Schmidlapp             pte_push_cleanup( &_cleanup, (pte_cleanup_callback_t) (_rout), (_arg) ); \
565*062c5bc4SJason Schmidlapp 
566*062c5bc4SJason Schmidlapp #define pthread_cleanup_pop( _execute ) \
567*062c5bc4SJason Schmidlapp             (void) pte_pop_cleanup( _execute ); \
568*062c5bc4SJason Schmidlapp         }
569*062c5bc4SJason Schmidlapp 
570*062c5bc4SJason Schmidlapp #else /* PTE_CLEANUP_C */
571*062c5bc4SJason Schmidlapp 
572*062c5bc4SJason Schmidlapp #ifdef PTE_CLEANUP_CXX
573*062c5bc4SJason Schmidlapp 
574*062c5bc4SJason Schmidlapp     /*
575*062c5bc4SJason Schmidlapp     * C++ version of cancel cleanup.
576*062c5bc4SJason Schmidlapp     * - John E. Bossom.
577*062c5bc4SJason Schmidlapp     */
578*062c5bc4SJason Schmidlapp 
579*062c5bc4SJason Schmidlapp     class PThreadCleanup
580*062c5bc4SJason Schmidlapp       {
581*062c5bc4SJason Schmidlapp         /*
582*062c5bc4SJason Schmidlapp         * PThreadCleanup
583*062c5bc4SJason Schmidlapp         *
584*062c5bc4SJason Schmidlapp         * Purpose
585*062c5bc4SJason Schmidlapp         *      This class is a C++ helper class that is
586*062c5bc4SJason Schmidlapp         *      used to implement pthread_cleanup_push/
587*062c5bc4SJason Schmidlapp         *      pthread_cleanup_pop.
588*062c5bc4SJason Schmidlapp         *      The destructor of this class automatically
589*062c5bc4SJason Schmidlapp         *      pops the pushed cleanup routine regardless
590*062c5bc4SJason Schmidlapp         *      of how the code exits the scope
591*062c5bc4SJason Schmidlapp         *      (i.e. such as by an exception)
592*062c5bc4SJason Schmidlapp         */
593*062c5bc4SJason Schmidlapp         pte_cleanup_callback_t cleanUpRout;
594*062c5bc4SJason Schmidlapp         void    *       obj;
595*062c5bc4SJason Schmidlapp         int             executeIt;
596*062c5bc4SJason Schmidlapp 
597*062c5bc4SJason Schmidlapp       public:
598*062c5bc4SJason Schmidlapp         PThreadCleanup() :
599*062c5bc4SJason Schmidlapp             cleanUpRout( 0 ),
600*062c5bc4SJason Schmidlapp             obj( 0 ),
601*062c5bc4SJason Schmidlapp             executeIt( 0 )
602*062c5bc4SJason Schmidlapp             /*
603*062c5bc4SJason Schmidlapp             * No cleanup performed
604*062c5bc4SJason Schmidlapp             */
605*062c5bc4SJason Schmidlapp         {
606*062c5bc4SJason Schmidlapp         }
607*062c5bc4SJason Schmidlapp 
608*062c5bc4SJason Schmidlapp         PThreadCleanup(
609*062c5bc4SJason Schmidlapp           pte_cleanup_callback_t routine,
610*062c5bc4SJason Schmidlapp           void    *       arg ) :
611*062c5bc4SJason Schmidlapp             cleanUpRout( routine ),
612*062c5bc4SJason Schmidlapp             obj( arg ),
613*062c5bc4SJason Schmidlapp             executeIt( 1 )
614*062c5bc4SJason Schmidlapp             /*
615*062c5bc4SJason Schmidlapp             * Registers a cleanup routine for 'arg'
616*062c5bc4SJason Schmidlapp             */
617*062c5bc4SJason Schmidlapp         {
618*062c5bc4SJason Schmidlapp         }
619*062c5bc4SJason Schmidlapp 
620*062c5bc4SJason Schmidlapp         ~PThreadCleanup()
621*062c5bc4SJason Schmidlapp         {
622*062c5bc4SJason Schmidlapp           if ( executeIt )
623*062c5bc4SJason Schmidlapp             {
624*062c5bc4SJason Schmidlapp               (void) (*cleanUpRout)( obj );
625*062c5bc4SJason Schmidlapp             }
626*062c5bc4SJason Schmidlapp         }
627*062c5bc4SJason Schmidlapp 
628*062c5bc4SJason Schmidlapp         void execute( int exec )
629*062c5bc4SJason Schmidlapp         {
630*062c5bc4SJason Schmidlapp           executeIt = exec;
631*062c5bc4SJason Schmidlapp         }
632*062c5bc4SJason Schmidlapp       };
633*062c5bc4SJason Schmidlapp 
634*062c5bc4SJason Schmidlapp     /*
635*062c5bc4SJason Schmidlapp     * C++ implementation of PThreads cancel cleanup;
636*062c5bc4SJason Schmidlapp     * This implementation takes advantage of a helper
637*062c5bc4SJason Schmidlapp     * class who's destructor automatically calls the
638*062c5bc4SJason Schmidlapp     * cleanup routine if we exit our scope weirdly
639*062c5bc4SJason Schmidlapp     */
640*062c5bc4SJason Schmidlapp #define pthread_cleanup_push( _rout, _arg ) \
641*062c5bc4SJason Schmidlapp         { \
642*062c5bc4SJason Schmidlapp             PThreadCleanup  cleanup((pte_cleanup_callback_t)(_rout), \
643*062c5bc4SJason Schmidlapp                                     (void *) (_arg) );
644*062c5bc4SJason Schmidlapp 
645*062c5bc4SJason Schmidlapp #define pthread_cleanup_pop( _execute ) \
646*062c5bc4SJason Schmidlapp             cleanup.execute( _execute ); \
647*062c5bc4SJason Schmidlapp         }
648*062c5bc4SJason Schmidlapp 
649*062c5bc4SJason Schmidlapp #else
650*062c5bc4SJason Schmidlapp 
651*062c5bc4SJason Schmidlapp #error ERROR [__FILE__, line __LINE__]: Cleanup type undefined.
652*062c5bc4SJason Schmidlapp 
653*062c5bc4SJason Schmidlapp #endif /* PTE_CLEANUP_CXX */
654*062c5bc4SJason Schmidlapp 
655*062c5bc4SJason Schmidlapp #endif /* PTE_CLEANUP_C */
656*062c5bc4SJason Schmidlapp 
657*062c5bc4SJason Schmidlapp     /*
658*062c5bc4SJason Schmidlapp      * ===============
659*062c5bc4SJason Schmidlapp      * ===============
660*062c5bc4SJason Schmidlapp      * Methods
661*062c5bc4SJason Schmidlapp      * ===============
662*062c5bc4SJason Schmidlapp      * ===============
663*062c5bc4SJason Schmidlapp      */
664*062c5bc4SJason Schmidlapp 
665*062c5bc4SJason Schmidlapp     int  pthread_init (void);
666*062c5bc4SJason Schmidlapp     void  pthread_terminate (void);
667*062c5bc4SJason Schmidlapp 
668*062c5bc4SJason Schmidlapp     /*
669*062c5bc4SJason Schmidlapp      * PThread Attribute Functions
670*062c5bc4SJason Schmidlapp      */
671*062c5bc4SJason Schmidlapp     int  pthread_attr_init (pthread_attr_t * attr);
672*062c5bc4SJason Schmidlapp 
673*062c5bc4SJason Schmidlapp     int  pthread_attr_destroy (pthread_attr_t * attr);
674*062c5bc4SJason Schmidlapp 
675*062c5bc4SJason Schmidlapp     int  pthread_attr_getdetachstate (const pthread_attr_t * attr,
676*062c5bc4SJason Schmidlapp                                       int *detachstate);
677*062c5bc4SJason Schmidlapp 
678*062c5bc4SJason Schmidlapp     int  pthread_attr_getstackaddr (const pthread_attr_t * attr,
679*062c5bc4SJason Schmidlapp                                     void **stackaddr);
680*062c5bc4SJason Schmidlapp 
681*062c5bc4SJason Schmidlapp     int  pthread_attr_getstacksize (const pthread_attr_t * attr,
682*062c5bc4SJason Schmidlapp                                     size_t * stacksize);
683*062c5bc4SJason Schmidlapp 
684*062c5bc4SJason Schmidlapp     int  pthread_attr_setdetachstate (pthread_attr_t * attr,
685*062c5bc4SJason Schmidlapp                                       int detachstate);
686*062c5bc4SJason Schmidlapp 
687*062c5bc4SJason Schmidlapp     int  pthread_attr_setstackaddr (pthread_attr_t * attr,
688*062c5bc4SJason Schmidlapp                                     void *stackaddr);
689*062c5bc4SJason Schmidlapp 
690*062c5bc4SJason Schmidlapp     int  pthread_attr_setstacksize (pthread_attr_t * attr,
691*062c5bc4SJason Schmidlapp                                     size_t stacksize);
692*062c5bc4SJason Schmidlapp 
693*062c5bc4SJason Schmidlapp     int  pthread_attr_getschedparam (const pthread_attr_t *attr,
694*062c5bc4SJason Schmidlapp                                      struct sched_param *param);
695*062c5bc4SJason Schmidlapp 
696*062c5bc4SJason Schmidlapp     int  pthread_attr_setschedparam (pthread_attr_t *attr,
697*062c5bc4SJason Schmidlapp                                      const struct sched_param *param);
698*062c5bc4SJason Schmidlapp 
699*062c5bc4SJason Schmidlapp     int  pthread_attr_setschedpolicy (pthread_attr_t *,
700*062c5bc4SJason Schmidlapp                                       int);
701*062c5bc4SJason Schmidlapp 
702*062c5bc4SJason Schmidlapp     int  pthread_attr_getschedpolicy (pthread_attr_t *,
703*062c5bc4SJason Schmidlapp                                       int *);
704*062c5bc4SJason Schmidlapp 
705*062c5bc4SJason Schmidlapp     int  pthread_attr_setinheritsched(pthread_attr_t * attr,
706*062c5bc4SJason Schmidlapp                                       int inheritsched);
707*062c5bc4SJason Schmidlapp 
708*062c5bc4SJason Schmidlapp     int  pthread_attr_getinheritsched(pthread_attr_t * attr,
709*062c5bc4SJason Schmidlapp                                       int * inheritsched);
710*062c5bc4SJason Schmidlapp 
711*062c5bc4SJason Schmidlapp     int  pthread_attr_setscope (pthread_attr_t *,
712*062c5bc4SJason Schmidlapp                                 int);
713*062c5bc4SJason Schmidlapp 
714*062c5bc4SJason Schmidlapp     int  pthread_attr_getscope (const pthread_attr_t *,
715*062c5bc4SJason Schmidlapp                                 int *);
716*062c5bc4SJason Schmidlapp 
717*062c5bc4SJason Schmidlapp     /*
718*062c5bc4SJason Schmidlapp      * PThread Functions
719*062c5bc4SJason Schmidlapp      */
720*062c5bc4SJason Schmidlapp     int  pthread_create (pthread_t * tid,
721*062c5bc4SJason Schmidlapp                          const pthread_attr_t * attr,
722*062c5bc4SJason Schmidlapp                          void *(*start) (void *),
723*062c5bc4SJason Schmidlapp                          void *arg);
724*062c5bc4SJason Schmidlapp 
725*062c5bc4SJason Schmidlapp     int  pthread_detach (pthread_t tid);
726*062c5bc4SJason Schmidlapp 
727*062c5bc4SJason Schmidlapp     int  pthread_equal (pthread_t t1,
728*062c5bc4SJason Schmidlapp                         pthread_t t2);
729*062c5bc4SJason Schmidlapp 
730*062c5bc4SJason Schmidlapp     void  pthread_exit (void *value_ptr);
731*062c5bc4SJason Schmidlapp 
732*062c5bc4SJason Schmidlapp     int  pthread_join (pthread_t thread,
733*062c5bc4SJason Schmidlapp                        void **value_ptr);
734*062c5bc4SJason Schmidlapp 
735*062c5bc4SJason Schmidlapp     pthread_t  pthread_self (void);
736*062c5bc4SJason Schmidlapp 
737*062c5bc4SJason Schmidlapp     int  pthread_cancel (pthread_t thread);
738*062c5bc4SJason Schmidlapp 
739*062c5bc4SJason Schmidlapp     int  pthread_setcancelstate (int state,
740*062c5bc4SJason Schmidlapp                                  int *oldstate);
741*062c5bc4SJason Schmidlapp 
742*062c5bc4SJason Schmidlapp     int  pthread_setcanceltype (int type,
743*062c5bc4SJason Schmidlapp                                 int *oldtype);
744*062c5bc4SJason Schmidlapp 
745*062c5bc4SJason Schmidlapp     void  pthread_testcancel (void);
746*062c5bc4SJason Schmidlapp 
747*062c5bc4SJason Schmidlapp     int  pthread_once (pthread_once_t * once_control,
748*062c5bc4SJason Schmidlapp                        void (*init_routine) (void));
749*062c5bc4SJason Schmidlapp 
750*062c5bc4SJason Schmidlapp #if PTE_LEVEL >= PTE_LEVEL_MAX
751*062c5bc4SJason Schmidlapp     pte_cleanup_t *  pte_pop_cleanup (int execute);
752*062c5bc4SJason Schmidlapp 
753*062c5bc4SJason Schmidlapp     void  pte_push_cleanup (pte_cleanup_t * cleanup,
754*062c5bc4SJason Schmidlapp                             void (*routine) (void *),
755*062c5bc4SJason Schmidlapp                             void *arg);
756*062c5bc4SJason Schmidlapp #endif /* PTE_LEVEL >= PTE_LEVEL_MAX */
757*062c5bc4SJason Schmidlapp 
758*062c5bc4SJason Schmidlapp     /*
759*062c5bc4SJason Schmidlapp      * Thread Specific Data Functions
760*062c5bc4SJason Schmidlapp      */
761*062c5bc4SJason Schmidlapp     int  pthread_key_create (pthread_key_t * key,
762*062c5bc4SJason Schmidlapp                              void (*destructor) (void *));
763*062c5bc4SJason Schmidlapp 
764*062c5bc4SJason Schmidlapp     int  pthread_key_delete (pthread_key_t key);
765*062c5bc4SJason Schmidlapp 
766*062c5bc4SJason Schmidlapp     int  pthread_setspecific (pthread_key_t key,
767*062c5bc4SJason Schmidlapp                               const void *value);
768*062c5bc4SJason Schmidlapp 
769*062c5bc4SJason Schmidlapp     void *  pthread_getspecific (pthread_key_t key);
770*062c5bc4SJason Schmidlapp 
771*062c5bc4SJason Schmidlapp 
772*062c5bc4SJason Schmidlapp     /*
773*062c5bc4SJason Schmidlapp      * Mutex Attribute Functions
774*062c5bc4SJason Schmidlapp      */
775*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_init (pthread_mutexattr_t * attr);
776*062c5bc4SJason Schmidlapp 
777*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_destroy (pthread_mutexattr_t * attr);
778*062c5bc4SJason Schmidlapp 
779*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_getpshared (const pthread_mutexattr_t
780*062c5bc4SJason Schmidlapp                                        * attr,
781*062c5bc4SJason Schmidlapp                                        int *pshared);
782*062c5bc4SJason Schmidlapp 
783*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_setpshared (pthread_mutexattr_t * attr,
784*062c5bc4SJason Schmidlapp                                        int pshared);
785*062c5bc4SJason Schmidlapp 
786*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);
787*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind);
788*062c5bc4SJason Schmidlapp 
789*062c5bc4SJason Schmidlapp     /*
790*062c5bc4SJason Schmidlapp      * Barrier Attribute Functions
791*062c5bc4SJason Schmidlapp      */
792*062c5bc4SJason Schmidlapp     int  pthread_barrierattr_init (pthread_barrierattr_t * attr);
793*062c5bc4SJason Schmidlapp 
794*062c5bc4SJason Schmidlapp     int  pthread_barrierattr_destroy (pthread_barrierattr_t * attr);
795*062c5bc4SJason Schmidlapp 
796*062c5bc4SJason Schmidlapp     int  pthread_barrierattr_getpshared (const pthread_barrierattr_t
797*062c5bc4SJason Schmidlapp                                          * attr,
798*062c5bc4SJason Schmidlapp                                          int *pshared);
799*062c5bc4SJason Schmidlapp 
800*062c5bc4SJason Schmidlapp     int  pthread_barrierattr_setpshared (pthread_barrierattr_t * attr,
801*062c5bc4SJason Schmidlapp                                          int pshared);
802*062c5bc4SJason Schmidlapp 
803*062c5bc4SJason Schmidlapp     /*
804*062c5bc4SJason Schmidlapp      * Mutex Functions
805*062c5bc4SJason Schmidlapp      */
806*062c5bc4SJason Schmidlapp     int  pthread_mutex_init (pthread_mutex_t * mutex,
807*062c5bc4SJason Schmidlapp                              const pthread_mutexattr_t * attr);
808*062c5bc4SJason Schmidlapp 
809*062c5bc4SJason Schmidlapp     int  pthread_mutex_destroy (pthread_mutex_t * mutex);
810*062c5bc4SJason Schmidlapp 
811*062c5bc4SJason Schmidlapp     int  pthread_mutex_lock (pthread_mutex_t * mutex);
812*062c5bc4SJason Schmidlapp 
813*062c5bc4SJason Schmidlapp     int  pthread_mutex_timedlock(pthread_mutex_t *mutex,
814*062c5bc4SJason Schmidlapp                                  const struct timespec *abstime);
815*062c5bc4SJason Schmidlapp 
816*062c5bc4SJason Schmidlapp     int  pthread_mutex_trylock (pthread_mutex_t * mutex);
817*062c5bc4SJason Schmidlapp 
818*062c5bc4SJason Schmidlapp     int  pthread_mutex_unlock (pthread_mutex_t * mutex);
819*062c5bc4SJason Schmidlapp 
820*062c5bc4SJason Schmidlapp     /*
821*062c5bc4SJason Schmidlapp      * Spinlock Functions
822*062c5bc4SJason Schmidlapp      */
823*062c5bc4SJason Schmidlapp     int  pthread_spin_init (pthread_spinlock_t * lock, int pshared);
824*062c5bc4SJason Schmidlapp 
825*062c5bc4SJason Schmidlapp     int  pthread_spin_destroy (pthread_spinlock_t * lock);
826*062c5bc4SJason Schmidlapp 
827*062c5bc4SJason Schmidlapp     int  pthread_spin_lock (pthread_spinlock_t * lock);
828*062c5bc4SJason Schmidlapp 
829*062c5bc4SJason Schmidlapp     int  pthread_spin_trylock (pthread_spinlock_t * lock);
830*062c5bc4SJason Schmidlapp 
831*062c5bc4SJason Schmidlapp     int  pthread_spin_unlock (pthread_spinlock_t * lock);
832*062c5bc4SJason Schmidlapp 
833*062c5bc4SJason Schmidlapp     /*
834*062c5bc4SJason Schmidlapp      * Barrier Functions
835*062c5bc4SJason Schmidlapp      */
836*062c5bc4SJason Schmidlapp     int  pthread_barrier_init (pthread_barrier_t * barrier,
837*062c5bc4SJason Schmidlapp                                const pthread_barrierattr_t * attr,
838*062c5bc4SJason Schmidlapp                                unsigned int count);
839*062c5bc4SJason Schmidlapp 
840*062c5bc4SJason Schmidlapp     int  pthread_barrier_destroy (pthread_barrier_t * barrier);
841*062c5bc4SJason Schmidlapp 
842*062c5bc4SJason Schmidlapp     int  pthread_barrier_wait (pthread_barrier_t * barrier);
843*062c5bc4SJason Schmidlapp 
844*062c5bc4SJason Schmidlapp     /*
845*062c5bc4SJason Schmidlapp      * Condition Variable Attribute Functions
846*062c5bc4SJason Schmidlapp      */
847*062c5bc4SJason Schmidlapp     int  pthread_condattr_init (pthread_condattr_t * attr);
848*062c5bc4SJason Schmidlapp 
849*062c5bc4SJason Schmidlapp     int  pthread_condattr_destroy (pthread_condattr_t * attr);
850*062c5bc4SJason Schmidlapp 
851*062c5bc4SJason Schmidlapp     int  pthread_condattr_getpshared (const pthread_condattr_t * attr,
852*062c5bc4SJason Schmidlapp                                       int *pshared);
853*062c5bc4SJason Schmidlapp 
854*062c5bc4SJason Schmidlapp     int  pthread_condattr_setpshared (pthread_condattr_t * attr,
855*062c5bc4SJason Schmidlapp                                       int pshared);
856*062c5bc4SJason Schmidlapp 
857*062c5bc4SJason Schmidlapp     /*
858*062c5bc4SJason Schmidlapp      * Condition Variable Functions
859*062c5bc4SJason Schmidlapp      */
860*062c5bc4SJason Schmidlapp     int  pthread_cond_init (pthread_cond_t * cond,
861*062c5bc4SJason Schmidlapp                             const pthread_condattr_t * attr);
862*062c5bc4SJason Schmidlapp 
863*062c5bc4SJason Schmidlapp     int  pthread_cond_destroy (pthread_cond_t * cond);
864*062c5bc4SJason Schmidlapp 
865*062c5bc4SJason Schmidlapp     int  pthread_cond_wait (pthread_cond_t * cond,
866*062c5bc4SJason Schmidlapp                             pthread_mutex_t * mutex);
867*062c5bc4SJason Schmidlapp 
868*062c5bc4SJason Schmidlapp     int  pthread_cond_timedwait (pthread_cond_t * cond,
869*062c5bc4SJason Schmidlapp                                  pthread_mutex_t * mutex,
870*062c5bc4SJason Schmidlapp                                  const struct timespec *abstime);
871*062c5bc4SJason Schmidlapp 
872*062c5bc4SJason Schmidlapp     int  pthread_cond_signal (pthread_cond_t * cond);
873*062c5bc4SJason Schmidlapp 
874*062c5bc4SJason Schmidlapp     int  pthread_cond_broadcast (pthread_cond_t * cond);
875*062c5bc4SJason Schmidlapp 
876*062c5bc4SJason Schmidlapp     /*
877*062c5bc4SJason Schmidlapp      * Scheduling
878*062c5bc4SJason Schmidlapp      */
879*062c5bc4SJason Schmidlapp     int  pthread_setschedparam (pthread_t thread,
880*062c5bc4SJason Schmidlapp                                 int policy,
881*062c5bc4SJason Schmidlapp                                 const struct sched_param *param);
882*062c5bc4SJason Schmidlapp 
883*062c5bc4SJason Schmidlapp     int  pthread_getschedparam (pthread_t thread,
884*062c5bc4SJason Schmidlapp                                 int *policy,
885*062c5bc4SJason Schmidlapp                                 struct sched_param *param);
886*062c5bc4SJason Schmidlapp 
887*062c5bc4SJason Schmidlapp     int  pthread_setconcurrency (int);
888*062c5bc4SJason Schmidlapp 
889*062c5bc4SJason Schmidlapp     int  pthread_getconcurrency (void);
890*062c5bc4SJason Schmidlapp 
891*062c5bc4SJason Schmidlapp     /*
892*062c5bc4SJason Schmidlapp      * Read-Write Lock Functions
893*062c5bc4SJason Schmidlapp      */
894*062c5bc4SJason Schmidlapp     int  pthread_rwlock_init(pthread_rwlock_t *lock,
895*062c5bc4SJason Schmidlapp                              const pthread_rwlockattr_t *attr);
896*062c5bc4SJason Schmidlapp 
897*062c5bc4SJason Schmidlapp     int  pthread_rwlock_destroy(pthread_rwlock_t *lock);
898*062c5bc4SJason Schmidlapp 
899*062c5bc4SJason Schmidlapp     int  pthread_rwlock_tryrdlock(pthread_rwlock_t *);
900*062c5bc4SJason Schmidlapp 
901*062c5bc4SJason Schmidlapp     int  pthread_rwlock_trywrlock(pthread_rwlock_t *);
902*062c5bc4SJason Schmidlapp 
903*062c5bc4SJason Schmidlapp     int  pthread_rwlock_rdlock(pthread_rwlock_t *lock);
904*062c5bc4SJason Schmidlapp 
905*062c5bc4SJason Schmidlapp     int  pthread_rwlock_timedrdlock(pthread_rwlock_t *lock,
906*062c5bc4SJason Schmidlapp                                     const struct timespec *abstime);
907*062c5bc4SJason Schmidlapp 
908*062c5bc4SJason Schmidlapp     int  pthread_rwlock_wrlock(pthread_rwlock_t *lock);
909*062c5bc4SJason Schmidlapp 
910*062c5bc4SJason Schmidlapp     int  pthread_rwlock_timedwrlock(pthread_rwlock_t *lock,
911*062c5bc4SJason Schmidlapp                                     const struct timespec *abstime);
912*062c5bc4SJason Schmidlapp 
913*062c5bc4SJason Schmidlapp     int  pthread_rwlock_unlock(pthread_rwlock_t *lock);
914*062c5bc4SJason Schmidlapp 
915*062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_init (pthread_rwlockattr_t * attr);
916*062c5bc4SJason Schmidlapp 
917*062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr);
918*062c5bc4SJason Schmidlapp 
919*062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr,
920*062c5bc4SJason Schmidlapp                                         int *pshared);
921*062c5bc4SJason Schmidlapp 
922*062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr,
923*062c5bc4SJason Schmidlapp                                         int pshared);
924*062c5bc4SJason Schmidlapp 
925*062c5bc4SJason Schmidlapp #if PTE_LEVEL >= PTE_LEVEL_MAX - 1
926*062c5bc4SJason Schmidlapp 
927*062c5bc4SJason Schmidlapp     /*
928*062c5bc4SJason Schmidlapp      * Signal Functions. Should be defined in <signal.h> but we might
929*062c5bc4SJason Schmidlapp      * already have signal.h that don't define these.
930*062c5bc4SJason Schmidlapp      */
931*062c5bc4SJason Schmidlapp     int  pthread_kill(pthread_t thread, int sig);
932*062c5bc4SJason Schmidlapp 
933*062c5bc4SJason Schmidlapp     /*
934*062c5bc4SJason Schmidlapp      * Non-portable functions
935*062c5bc4SJason Schmidlapp      */
936*062c5bc4SJason Schmidlapp 
937*062c5bc4SJason Schmidlapp     /*
938*062c5bc4SJason Schmidlapp      * Compatibility with Linux.
939*062c5bc4SJason Schmidlapp      */
940*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr,
941*062c5bc4SJason Schmidlapp                                       int kind);
942*062c5bc4SJason Schmidlapp     int  pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr,
943*062c5bc4SJason Schmidlapp                                       int *kind);
944*062c5bc4SJason Schmidlapp 
945*062c5bc4SJason Schmidlapp     /*
946*062c5bc4SJason Schmidlapp      * Possibly supported by other POSIX threads implementations
947*062c5bc4SJason Schmidlapp      */
948*062c5bc4SJason Schmidlapp     int  pthread_delay_np (struct timespec * interval);
949*062c5bc4SJason Schmidlapp     int  pthread_num_processors_np(void);
950*062c5bc4SJason Schmidlapp 
951*062c5bc4SJason Schmidlapp     /*
952*062c5bc4SJason Schmidlapp      * Register a system time change with the library.
953*062c5bc4SJason Schmidlapp      * Causes the library to perform various functions
954*062c5bc4SJason Schmidlapp      * in response to the change. Should be called whenever
955*062c5bc4SJason Schmidlapp      * the application's top level window receives a
956*062c5bc4SJason Schmidlapp      * WM_TIMECHANGE message. It can be passed directly to
957*062c5bc4SJason Schmidlapp      * pthread_create() as a new thread if desired.
958*062c5bc4SJason Schmidlapp      */
959*062c5bc4SJason Schmidlapp     void *  pthread_timechange_handler_np(void *);
960*062c5bc4SJason Schmidlapp 
961*062c5bc4SJason Schmidlapp #endif /*PTE_LEVEL >= PTE_LEVEL_MAX - 1 */
962*062c5bc4SJason Schmidlapp 
963*062c5bc4SJason Schmidlapp #if PTE_LEVEL >= PTE_LEVEL_MAX
964*062c5bc4SJason Schmidlapp 
965*062c5bc4SJason Schmidlapp 
966*062c5bc4SJason Schmidlapp 
967*062c5bc4SJason Schmidlapp #endif /* PTE_LEVEL >= PTE_LEVEL_MAX */
968*062c5bc4SJason Schmidlapp 
969*062c5bc4SJason Schmidlapp     /*
970*062c5bc4SJason Schmidlapp      * Some compiler environments don't define some things.
971*062c5bc4SJason Schmidlapp      */
972*062c5bc4SJason Schmidlapp #  define _ftime ftime
973*062c5bc4SJason Schmidlapp #  define _timeb timeb
974*062c5bc4SJason Schmidlapp 
975*062c5bc4SJason Schmidlapp #ifdef __cplusplus
976*062c5bc4SJason Schmidlapp 
977*062c5bc4SJason Schmidlapp     /*
978*062c5bc4SJason Schmidlapp      * Internal exceptions
979*062c5bc4SJason Schmidlapp      */
980*062c5bc4SJason Schmidlapp     class pte_exception {};
981*062c5bc4SJason Schmidlapp     class pte_exception_cancel : public pte_exception {};
982*062c5bc4SJason Schmidlapp     class pte_exception_exit   : public pte_exception {};
983*062c5bc4SJason Schmidlapp 
984*062c5bc4SJason Schmidlapp #endif
985*062c5bc4SJason Schmidlapp 
986*062c5bc4SJason Schmidlapp 
987*062c5bc4SJason Schmidlapp #ifndef PTE_BUILD
988*062c5bc4SJason Schmidlapp 
989*062c5bc4SJason Schmidlapp #ifdef PTE_CLEANUP_CXX
990*062c5bc4SJason Schmidlapp 
991*062c5bc4SJason Schmidlapp     /*
992*062c5bc4SJason Schmidlapp      * Redefine the C++ catch keyword to ensure that applications
993*062c5bc4SJason Schmidlapp      * propagate our internal exceptions up to the library's internal handlers.
994*062c5bc4SJason Schmidlapp      */
995*062c5bc4SJason Schmidlapp #define catch( E ) \
996*062c5bc4SJason Schmidlapp         catch( pte_exception & ) { throw; } \
997*062c5bc4SJason Schmidlapp         catch( E )
998*062c5bc4SJason Schmidlapp 
999*062c5bc4SJason Schmidlapp #endif /* PTE_CLEANUP_CXX */
1000*062c5bc4SJason Schmidlapp 
1001*062c5bc4SJason Schmidlapp #endif /* ! PTE_BUILD */
1002*062c5bc4SJason Schmidlapp 
1003*062c5bc4SJason Schmidlapp #undef PTE_LEVEL
1004*062c5bc4SJason Schmidlapp #undef PTE_LEVEL_MAX
1005*062c5bc4SJason Schmidlapp 
1006*062c5bc4SJason Schmidlapp #endif /* PTHREAD_H */
1007