xref: /relibc/pthreads-emb/pthread.h (revision dc52dd286f8a3968dab4b88483b2b906fdca64cb)
1062c5bc4SJason Schmidlapp /* This is an implementation of the threads API of POSIX 1003.1-2001.
2062c5bc4SJason Schmidlapp  *
3062c5bc4SJason Schmidlapp  * --------------------------------------------------------------------------
4062c5bc4SJason Schmidlapp  *
5062c5bc4SJason Schmidlapp  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
6062c5bc4SJason Schmidlapp  *      Copyright(C) 2008 Jason Schmidlapp
7062c5bc4SJason Schmidlapp  *
8062c5bc4SJason Schmidlapp  *      Contact Email: jschmidlapp@users.sourceforge.net
9062c5bc4SJason Schmidlapp  *
10062c5bc4SJason Schmidlapp  *
11062c5bc4SJason Schmidlapp  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
12062c5bc4SJason Schmidlapp  *      Copyright(C) 2008 Jason Schmidlapp
13062c5bc4SJason Schmidlapp  *
14062c5bc4SJason Schmidlapp  *      Contact Email: jschmidlapp@users.sourceforge.net
15062c5bc4SJason Schmidlapp  *
16062c5bc4SJason Schmidlapp  *
17062c5bc4SJason Schmidlapp  *      Based upon Pthreads-win32 - POSIX Threads Library for Win32
18062c5bc4SJason Schmidlapp  *      Copyright(C) 1998 John E. Bossom
19062c5bc4SJason Schmidlapp  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
20062c5bc4SJason Schmidlapp  *
21062c5bc4SJason Schmidlapp  *      Contact Email: rpj@callisto.canberra.edu.au
22062c5bc4SJason Schmidlapp  *
23062c5bc4SJason Schmidlapp  *      The original list of contributors to the Pthreads-win32 project
24062c5bc4SJason Schmidlapp  *      is contained in the file CONTRIBUTORS.ptw32 included with the
25062c5bc4SJason Schmidlapp  *      source code distribution. The list can also be seen at the
26062c5bc4SJason Schmidlapp  *      following World Wide Web location:
27062c5bc4SJason Schmidlapp  *      http://sources.redhat.com/pthreads-win32/contributors.html
28062c5bc4SJason Schmidlapp  *
29062c5bc4SJason Schmidlapp  *      This library is free software; you can redistribute it and/or
30062c5bc4SJason Schmidlapp  *      modify it under the terms of the GNU Lesser General Public
31062c5bc4SJason Schmidlapp  *      License as published by the Free Software Foundation; either
32062c5bc4SJason Schmidlapp  *      version 2 of the License, or (at your option) any later version.
33062c5bc4SJason Schmidlapp  *
34062c5bc4SJason Schmidlapp  *      This library is distributed in the hope that it will be useful,
35062c5bc4SJason Schmidlapp  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
36062c5bc4SJason Schmidlapp  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
37062c5bc4SJason Schmidlapp  *      Lesser General Public License for more details.
38062c5bc4SJason Schmidlapp  *
39062c5bc4SJason Schmidlapp  *      You should have received a copy of the GNU Lesser General Public
40062c5bc4SJason Schmidlapp  *      License along with this library in the file COPYING.LIB;
41062c5bc4SJason Schmidlapp  *      if not, write to the Free Software Foundation, Inc.,
42062c5bc4SJason Schmidlapp  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
43062c5bc4SJason Schmidlapp  */
44062c5bc4SJason Schmidlapp #if !defined( PTHREAD_H )
45062c5bc4SJason Schmidlapp #define PTHREAD_H
46062c5bc4SJason Schmidlapp 
47714af18cSJason Schmidlapp #include <pte_types.h>
48062c5bc4SJason Schmidlapp 
49062c5bc4SJason Schmidlapp #include <sched.h>
50062c5bc4SJason Schmidlapp 
51062c5bc4SJason Schmidlapp #define PTE_VERSION 2,8,0,0
52062c5bc4SJason Schmidlapp #define PTE_VERSION_STRING "2, 8, 0, 0\0"
53062c5bc4SJason Schmidlapp 
54062c5bc4SJason Schmidlapp /* There are two implementations of cancel cleanup.
55062c5bc4SJason Schmidlapp  * Note that pthread.h is included in both application
56062c5bc4SJason Schmidlapp  * compilation units and also internally for the library.
57062c5bc4SJason Schmidlapp  * The code here and within the library aims to work
58062c5bc4SJason Schmidlapp  * for all reasonable combinations of environments.
59062c5bc4SJason Schmidlapp  *
60062c5bc4SJason Schmidlapp  * The two implementations are:
61062c5bc4SJason Schmidlapp  *
62062c5bc4SJason Schmidlapp  *   C
63062c5bc4SJason Schmidlapp  *   C++
64062c5bc4SJason Schmidlapp  *
65062c5bc4SJason Schmidlapp  */
66062c5bc4SJason Schmidlapp 
67062c5bc4SJason Schmidlapp /*
68062c5bc4SJason Schmidlapp  * Define defaults for cleanup code.
69062c5bc4SJason Schmidlapp  * Note: Unless the build explicitly defines one of the following, then
70062c5bc4SJason Schmidlapp  * we default to standard C style cleanup. This style uses setjmp/longjmp
71062c5bc4SJason Schmidlapp  * in the cancelation and thread exit implementations and therefore won't
72062c5bc4SJason Schmidlapp  * do stack unwinding if linked to applications that have it (e.g.
73062c5bc4SJason Schmidlapp  * C++ apps). This is currently consistent with most/all commercial Unix
74062c5bc4SJason Schmidlapp  * POSIX threads implementations.
75062c5bc4SJason Schmidlapp  */
76062c5bc4SJason Schmidlapp #if !defined( PTE_CLEANUP_CXX ) && !defined( PTE_CLEANUP_C )
77062c5bc4SJason Schmidlapp # define PTE_CLEANUP_C
78062c5bc4SJason Schmidlapp #endif
79062c5bc4SJason Schmidlapp 
80062c5bc4SJason Schmidlapp #undef PTE_LEVEL
81062c5bc4SJason Schmidlapp 
82062c5bc4SJason Schmidlapp #if defined(_POSIX_SOURCE)
83062c5bc4SJason Schmidlapp #define PTE_LEVEL 0
84062c5bc4SJason Schmidlapp /* Early POSIX */
85062c5bc4SJason Schmidlapp #endif
86062c5bc4SJason Schmidlapp 
87062c5bc4SJason Schmidlapp #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
88062c5bc4SJason Schmidlapp #undef PTE_LEVEL
89062c5bc4SJason Schmidlapp #define PTE_LEVEL 1
90062c5bc4SJason Schmidlapp /* Include 1b, 1c and 1d */
91062c5bc4SJason Schmidlapp #endif
92062c5bc4SJason Schmidlapp 
93062c5bc4SJason Schmidlapp #if defined(INCLUDE_NP)
94062c5bc4SJason Schmidlapp #undef PTE_LEVEL
95062c5bc4SJason Schmidlapp #define PTE_LEVEL 2
96062c5bc4SJason Schmidlapp /* Include Non-Portable extensions */
97062c5bc4SJason Schmidlapp #endif
98062c5bc4SJason Schmidlapp 
99062c5bc4SJason Schmidlapp #define PTE_LEVEL_MAX 3
100062c5bc4SJason Schmidlapp 
101062c5bc4SJason Schmidlapp #if !defined(PTE_LEVEL)
102062c5bc4SJason Schmidlapp #define PTE_LEVEL PTE_LEVEL_MAX
103062c5bc4SJason Schmidlapp /* Include everything */
104062c5bc4SJason Schmidlapp #endif
105062c5bc4SJason Schmidlapp 
106062c5bc4SJason Schmidlapp /*
107062c5bc4SJason Schmidlapp  * -------------------------------------------------------------
108062c5bc4SJason Schmidlapp  *
109062c5bc4SJason Schmidlapp  *
110062c5bc4SJason Schmidlapp  * Module: pthread.h
111062c5bc4SJason Schmidlapp  *
112062c5bc4SJason Schmidlapp  * Purpose:
113062c5bc4SJason Schmidlapp  *      Provides an implementation of PThreads based upon the
114062c5bc4SJason Schmidlapp  *      standard:
115062c5bc4SJason Schmidlapp  *
116062c5bc4SJason Schmidlapp  *              POSIX 1003.1-2001
117062c5bc4SJason Schmidlapp  *  and
118062c5bc4SJason Schmidlapp  *    The Single Unix Specification version 3
119062c5bc4SJason Schmidlapp  *
120062c5bc4SJason Schmidlapp  *    (these two are equivalent)
121062c5bc4SJason Schmidlapp  *
122062c5bc4SJason Schmidlapp  *      in order to enhance code portability between Windows,
123062c5bc4SJason Schmidlapp  *  various commercial Unix implementations, and Linux.
124062c5bc4SJason Schmidlapp  *
125062c5bc4SJason Schmidlapp  *      See the ANNOUNCE file for a full list of conforming
126062c5bc4SJason Schmidlapp  *      routines and defined constants, and a list of missing
127062c5bc4SJason Schmidlapp  *      routines and constants not defined in this implementation.
128062c5bc4SJason Schmidlapp  *
129062c5bc4SJason Schmidlapp  * Authors:
130062c5bc4SJason Schmidlapp  *      There have been many contributors to this library.
131062c5bc4SJason Schmidlapp  *      The initial implementation was contributed by
132062c5bc4SJason Schmidlapp  *      John Bossom, and several others have provided major
133062c5bc4SJason Schmidlapp  *      sections or revisions of parts of the implementation.
134062c5bc4SJason Schmidlapp  *      Often significant effort has been contributed to
135062c5bc4SJason Schmidlapp  *      find and fix important bugs and other problems to
136062c5bc4SJason Schmidlapp  *      improve the reliability of the library, which sometimes
137062c5bc4SJason Schmidlapp  *      is not reflected in the amount of code which changed as
138062c5bc4SJason Schmidlapp  *      result.
139062c5bc4SJason Schmidlapp  *      As much as possible, the contributors are acknowledged
140062c5bc4SJason Schmidlapp  *      in the ChangeLog file in the source code distribution
141062c5bc4SJason Schmidlapp  *      where their changes are noted in detail.
142062c5bc4SJason Schmidlapp  *
143062c5bc4SJason Schmidlapp  *      Contributors are listed in the CONTRIBUTORS file.
144062c5bc4SJason Schmidlapp  *
145062c5bc4SJason Schmidlapp  *      As usual, all bouquets go to the contributors, and all
146062c5bc4SJason Schmidlapp  *      brickbats go to the project maintainer.
147062c5bc4SJason Schmidlapp  *
148062c5bc4SJason Schmidlapp  * Maintainer:
149062c5bc4SJason Schmidlapp  *      The code base for this project is coordinated and
150062c5bc4SJason Schmidlapp  *      eventually pre-tested, packaged, and made available by
151062c5bc4SJason Schmidlapp  *
152062c5bc4SJason Schmidlapp  *              Ross Johnson <rpj@callisto.canberra.edu.au>
153062c5bc4SJason Schmidlapp  *
154062c5bc4SJason Schmidlapp  * QA Testers:
155062c5bc4SJason Schmidlapp  *      Ultimately, the library is tested in the real world by
156062c5bc4SJason Schmidlapp  *      a host of competent and demanding scientists and
157062c5bc4SJason Schmidlapp  *      engineers who report bugs and/or provide solutions
158062c5bc4SJason Schmidlapp  *      which are then fixed or incorporated into subsequent
159062c5bc4SJason Schmidlapp  *      versions of the library. Each time a bug is fixed, a
160062c5bc4SJason Schmidlapp  *      test case is written to prove the fix and ensure
161062c5bc4SJason Schmidlapp  *      that later changes to the code don't reintroduce the
162062c5bc4SJason Schmidlapp  *      same error. The number of test cases is slowly growing
163062c5bc4SJason Schmidlapp  *      and therefore so is the code reliability.
164062c5bc4SJason Schmidlapp  *
165062c5bc4SJason Schmidlapp  * Compliance:
166062c5bc4SJason Schmidlapp  *      See the file ANNOUNCE for the list of implemented
167062c5bc4SJason Schmidlapp  *      and not-implemented routines and defined options.
168062c5bc4SJason Schmidlapp  *      Of course, these are all defined is this file as well.
169062c5bc4SJason Schmidlapp  *
170062c5bc4SJason Schmidlapp  * Web site:
171062c5bc4SJason Schmidlapp  *      The source code and other information about this library
172062c5bc4SJason Schmidlapp  *      are available from
173062c5bc4SJason Schmidlapp  *
174062c5bc4SJason Schmidlapp  *              http://sources.redhat.com/pthreads-win32/
175062c5bc4SJason Schmidlapp  *
176062c5bc4SJason Schmidlapp  * -------------------------------------------------------------
177062c5bc4SJason Schmidlapp  */
178062c5bc4SJason Schmidlapp 
179062c5bc4SJason Schmidlapp #include <time.h>
180062c5bc4SJason Schmidlapp 
181062c5bc4SJason Schmidlapp #include <setjmp.h>
182062c5bc4SJason Schmidlapp #include <limits.h>
183062c5bc4SJason Schmidlapp 
184062c5bc4SJason Schmidlapp /*
185062c5bc4SJason Schmidlapp  * Boolean values to make us independent of system includes.
186062c5bc4SJason Schmidlapp  */
187062c5bc4SJason Schmidlapp enum
188062c5bc4SJason Schmidlapp {
189062c5bc4SJason Schmidlapp   PTE_FALSE = 0,
190062c5bc4SJason Schmidlapp   PTE_TRUE = (! PTE_FALSE)
191062c5bc4SJason Schmidlapp };
192062c5bc4SJason Schmidlapp 
193062c5bc4SJason Schmidlapp 
194062c5bc4SJason Schmidlapp     /*
195062c5bc4SJason Schmidlapp      * -------------------------------------------------------------
196062c5bc4SJason Schmidlapp      *
197062c5bc4SJason Schmidlapp      * POSIX 1003.1-2001 Options
198062c5bc4SJason Schmidlapp      * =========================
199062c5bc4SJason Schmidlapp      *
200062c5bc4SJason Schmidlapp      * Options are normally set in <unistd.h>, which is not provided
201062c5bc4SJason Schmidlapp      * with pthreads-embedded.
202062c5bc4SJason Schmidlapp      *
203062c5bc4SJason Schmidlapp      * For conformance with the Single Unix Specification (version 3), all of the
204062c5bc4SJason Schmidlapp      * options below are defined, and have a value of either -1 (not supported)
205062c5bc4SJason Schmidlapp      * or 200112L (supported).
206062c5bc4SJason Schmidlapp      *
207062c5bc4SJason Schmidlapp      * These options can neither be left undefined nor have a value of 0, because
208062c5bc4SJason Schmidlapp      * either indicates that sysconf(), which is not implemented, may be used at
209062c5bc4SJason Schmidlapp      * runtime to check the status of the option.
210062c5bc4SJason Schmidlapp      *
211062c5bc4SJason Schmidlapp      * _POSIX_THREADS (== 200112L)
212062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use threads
213062c5bc4SJason Schmidlapp      *
214062c5bc4SJason Schmidlapp      * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L)
215062c5bc4SJason Schmidlapp      *                      If == 200112L, you can control the size of a thread's
216062c5bc4SJason Schmidlapp      *                      stack
217062c5bc4SJason Schmidlapp      *                              pthread_attr_getstacksize
218062c5bc4SJason Schmidlapp      *                              pthread_attr_setstacksize
219062c5bc4SJason Schmidlapp      *
220062c5bc4SJason Schmidlapp      * _POSIX_THREAD_ATTR_STACKADDR (== -1)
221062c5bc4SJason Schmidlapp      *                      If == 200112L, you can allocate and control a thread's
222062c5bc4SJason Schmidlapp      *                      stack. If not supported, the following functions
223062c5bc4SJason Schmidlapp      *                      will return ENOSYS, indicating they are not
224062c5bc4SJason Schmidlapp      *                      supported:
225062c5bc4SJason Schmidlapp      *                              pthread_attr_getstackaddr
226062c5bc4SJason Schmidlapp      *                              pthread_attr_setstackaddr
227062c5bc4SJason Schmidlapp      *
228062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1)
229062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use realtime scheduling.
230062c5bc4SJason Schmidlapp      *                      This option indicates that the behaviour of some
231062c5bc4SJason Schmidlapp      *                      implemented functions conforms to the additional TPS
232062c5bc4SJason Schmidlapp      *                      requirements in the standard. E.g. rwlocks favour
233062c5bc4SJason Schmidlapp      *                      writers over readers when threads have equal priority.
234062c5bc4SJason Schmidlapp      *
235062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PRIO_INHERIT (== -1)
236062c5bc4SJason Schmidlapp      *                      If == 200112L, you can create priority inheritance
237062c5bc4SJason Schmidlapp      *                      mutexes.
238062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getprotocol +
239062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setprotocol +
240062c5bc4SJason Schmidlapp      *
241062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PRIO_PROTECT (== -1)
242062c5bc4SJason Schmidlapp      *                      If == 200112L, you can create priority ceiling mutexes
243062c5bc4SJason Schmidlapp      *                      Indicates the availability of:
244062c5bc4SJason Schmidlapp      *                              pthread_mutex_getprioceiling
245062c5bc4SJason Schmidlapp      *                              pthread_mutex_setprioceiling
246062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getprioceiling
247062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getprotocol     +
248062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setprioceiling
249062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setprotocol     +
250062c5bc4SJason Schmidlapp      *
251062c5bc4SJason Schmidlapp      * _POSIX_THREAD_PROCESS_SHARED (== -1)
252062c5bc4SJason Schmidlapp      *                      If set, you can create mutexes and condition
253062c5bc4SJason Schmidlapp      *                      variables that can be shared with another
254062c5bc4SJason Schmidlapp      *                      process.If set, indicates the availability
255062c5bc4SJason Schmidlapp      *                      of:
256062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_getpshared
257062c5bc4SJason Schmidlapp      *                              pthread_mutexattr_setpshared
258062c5bc4SJason Schmidlapp      *                              pthread_condattr_getpshared
259062c5bc4SJason Schmidlapp      *                              pthread_condattr_setpshared
260062c5bc4SJason Schmidlapp      *
261062c5bc4SJason Schmidlapp      * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L)
262062c5bc4SJason Schmidlapp      *                      If == 200112L you can use the special *_r library
263062c5bc4SJason Schmidlapp      *                      functions that provide thread-safe behaviour
264062c5bc4SJason Schmidlapp      *
265062c5bc4SJason Schmidlapp      * _POSIX_READER_WRITER_LOCKS (== 200112L)
266062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use read/write locks
267062c5bc4SJason Schmidlapp      *
268062c5bc4SJason Schmidlapp      * _POSIX_SPIN_LOCKS (== 200112L)
269062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use spin locks
270062c5bc4SJason Schmidlapp      *
271062c5bc4SJason Schmidlapp      * _POSIX_BARRIERS (== 200112L)
272062c5bc4SJason Schmidlapp      *                      If == 200112L, you can use barriers
273062c5bc4SJason Schmidlapp      *
274062c5bc4SJason Schmidlapp      *      + These functions provide both 'inherit' and/or
275062c5bc4SJason Schmidlapp      *        'protect' protocol, based upon these macro
276062c5bc4SJason Schmidlapp      *        settings.
277062c5bc4SJason Schmidlapp      *
278062c5bc4SJason Schmidlapp      * -------------------------------------------------------------
279062c5bc4SJason Schmidlapp      */
280062c5bc4SJason Schmidlapp 
281062c5bc4SJason Schmidlapp     /*
282062c5bc4SJason Schmidlapp      * POSIX Options
283062c5bc4SJason Schmidlapp      */
284062c5bc4SJason Schmidlapp #undef _POSIX_THREADS
285062c5bc4SJason Schmidlapp #define _POSIX_THREADS 200112L
286062c5bc4SJason Schmidlapp 
287062c5bc4SJason Schmidlapp #undef _POSIX_READER_WRITER_LOCKS
288062c5bc4SJason Schmidlapp #define _POSIX_READER_WRITER_LOCKS 200112L
289062c5bc4SJason Schmidlapp 
290062c5bc4SJason Schmidlapp #undef _POSIX_SPIN_LOCKS
291062c5bc4SJason Schmidlapp #define _POSIX_SPIN_LOCKS 200112L
292062c5bc4SJason Schmidlapp 
293062c5bc4SJason Schmidlapp #undef _POSIX_BARRIERS
294062c5bc4SJason Schmidlapp #define _POSIX_BARRIERS 200112L
295062c5bc4SJason Schmidlapp 
296062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_SAFE_FUNCTIONS
297062c5bc4SJason Schmidlapp #define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
298062c5bc4SJason Schmidlapp 
299062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_ATTR_STACKSIZE
300062c5bc4SJason Schmidlapp #define _POSIX_THREAD_ATTR_STACKSIZE 200112L
301062c5bc4SJason Schmidlapp 
302062c5bc4SJason Schmidlapp     /*
303062c5bc4SJason Schmidlapp      * The following options are not supported
304062c5bc4SJason Schmidlapp      */
305062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_ATTR_STACKADDR
306062c5bc4SJason Schmidlapp #define _POSIX_THREAD_ATTR_STACKADDR -1
307062c5bc4SJason Schmidlapp 
308062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PRIO_INHERIT
309062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PRIO_INHERIT -1
310062c5bc4SJason Schmidlapp 
311062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PRIO_PROTECT
312062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PRIO_PROTECT -1
313062c5bc4SJason Schmidlapp 
314062c5bc4SJason Schmidlapp     /* TPS is not fully supported.  */
315062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PRIORITY_SCHEDULING
316062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PRIORITY_SCHEDULING -1
317062c5bc4SJason Schmidlapp 
318062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_PROCESS_SHARED
319062c5bc4SJason Schmidlapp #define _POSIX_THREAD_PROCESS_SHARED -1
320062c5bc4SJason Schmidlapp 
321062c5bc4SJason Schmidlapp 
322062c5bc4SJason Schmidlapp     /*
323062c5bc4SJason Schmidlapp      * POSIX 1003.1-2001 Limits
324062c5bc4SJason Schmidlapp      * ===========================
325062c5bc4SJason Schmidlapp      *
326062c5bc4SJason Schmidlapp      * These limits are normally set in <limits.h>, which is not provided with
327062c5bc4SJason Schmidlapp      * pthreads-embedded.
328062c5bc4SJason Schmidlapp      *
329062c5bc4SJason Schmidlapp      * PTHREAD_DESTRUCTOR_ITERATIONS
330062c5bc4SJason Schmidlapp      *                      Maximum number of attempts to destroy
331062c5bc4SJason Schmidlapp      *                      a thread's thread-specific data on
332062c5bc4SJason Schmidlapp      *                      termination (must be at least 4)
333062c5bc4SJason Schmidlapp      *
334062c5bc4SJason Schmidlapp      * PTHREAD_KEYS_MAX
335062c5bc4SJason Schmidlapp      *                      Maximum number of thread-specific data keys
336062c5bc4SJason Schmidlapp      *                      available per process (must be at least 128)
337062c5bc4SJason Schmidlapp      *
338062c5bc4SJason Schmidlapp      * PTHREAD_STACK_MIN
339062c5bc4SJason Schmidlapp      *                      Minimum supported stack size for a thread
340062c5bc4SJason Schmidlapp      *
341062c5bc4SJason Schmidlapp      * PTHREAD_THREADS_MAX
342062c5bc4SJason Schmidlapp      *                      Maximum number of threads supported per
343062c5bc4SJason Schmidlapp      *                      process (must be at least 64).
344062c5bc4SJason Schmidlapp      *
345062c5bc4SJason Schmidlapp      * SEM_NSEMS_MAX
346062c5bc4SJason Schmidlapp      *                      The maximum number of semaphores a process can have.
347062c5bc4SJason Schmidlapp      *                      (must be at least 256)
348062c5bc4SJason Schmidlapp      *
349062c5bc4SJason Schmidlapp      * SEM_VALUE_MAX
350062c5bc4SJason Schmidlapp      *                      The maximum value a semaphore can have.
351062c5bc4SJason Schmidlapp      *                      (must be at least 32767)
352062c5bc4SJason Schmidlapp      *
353062c5bc4SJason Schmidlapp      */
354062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
355062c5bc4SJason Schmidlapp #define _POSIX_THREAD_DESTRUCTOR_ITERATIONS     4
356062c5bc4SJason Schmidlapp 
357062c5bc4SJason Schmidlapp #undef PTHREAD_DESTRUCTOR_ITERATIONS
358062c5bc4SJason Schmidlapp #define PTHREAD_DESTRUCTOR_ITERATIONS           _POSIX_THREAD_DESTRUCTOR_ITERATIONS
359062c5bc4SJason Schmidlapp 
360062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_KEYS_MAX
361062c5bc4SJason Schmidlapp #define _POSIX_THREAD_KEYS_MAX                  128
362062c5bc4SJason Schmidlapp 
363062c5bc4SJason Schmidlapp #undef PTHREAD_KEYS_MAX
364062c5bc4SJason Schmidlapp #define PTHREAD_KEYS_MAX                        _POSIX_THREAD_KEYS_MAX
365062c5bc4SJason Schmidlapp 
366062c5bc4SJason Schmidlapp #undef PTHREAD_STACK_MIN
367062c5bc4SJason Schmidlapp #define PTHREAD_STACK_MIN                       0
368062c5bc4SJason Schmidlapp 
369062c5bc4SJason Schmidlapp #undef _POSIX_THREAD_THREADS_MAX
370062c5bc4SJason Schmidlapp #define _POSIX_THREAD_THREADS_MAX               64
371062c5bc4SJason Schmidlapp 
372062c5bc4SJason Schmidlapp     /* Arbitrary value */
373062c5bc4SJason Schmidlapp #undef PTHREAD_THREADS_MAX
374062c5bc4SJason Schmidlapp #define PTHREAD_THREADS_MAX                     2019
375062c5bc4SJason Schmidlapp 
376062c5bc4SJason Schmidlapp #undef _POSIX_SEM_NSEMS_MAX
377062c5bc4SJason Schmidlapp #define _POSIX_SEM_NSEMS_MAX                    256
378062c5bc4SJason Schmidlapp 
379062c5bc4SJason Schmidlapp     /* Arbitrary value */
380062c5bc4SJason Schmidlapp #undef SEM_NSEMS_MAX
381062c5bc4SJason Schmidlapp #define SEM_NSEMS_MAX                           1024
382062c5bc4SJason Schmidlapp 
383062c5bc4SJason Schmidlapp #undef _POSIX_SEM_VALUE_MAX
384062c5bc4SJason Schmidlapp #define _POSIX_SEM_VALUE_MAX                    32767
385062c5bc4SJason Schmidlapp 
386062c5bc4SJason Schmidlapp #undef SEM_VALUE_MAX
387062c5bc4SJason Schmidlapp #define SEM_VALUE_MAX                           INT_MAX
388062c5bc4SJason Schmidlapp 
389062c5bc4SJason Schmidlapp 
390062c5bc4SJason Schmidlapp     /*
391062c5bc4SJason Schmidlapp      * Generic handle type - intended to extend uniqueness beyond
392062c5bc4SJason Schmidlapp      * that available with a simple pointer. It should scale for either
393062c5bc4SJason Schmidlapp      * IA-32 or IA-64.
394062c5bc4SJason Schmidlapp      */
395062c5bc4SJason Schmidlapp     typedef struct
396062c5bc4SJason Schmidlapp       {
397062c5bc4SJason Schmidlapp         void * p;                   /* Pointer to actual object */
398062c5bc4SJason Schmidlapp         unsigned int x;             /* Extra information - reuse count etc */
399062c5bc4SJason Schmidlapp       } pte_handle_t;
400062c5bc4SJason Schmidlapp 
401062c5bc4SJason Schmidlapp     typedef pte_handle_t pthread_t;
402062c5bc4SJason Schmidlapp     typedef struct pthread_attr_t_ * pthread_attr_t;
403062c5bc4SJason Schmidlapp     typedef struct pthread_once_t_ pthread_once_t;
404062c5bc4SJason Schmidlapp     typedef struct pthread_key_t_ * pthread_key_t;
405062c5bc4SJason Schmidlapp     typedef struct pthread_mutex_t_ * pthread_mutex_t;
406062c5bc4SJason Schmidlapp     typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t;
407062c5bc4SJason Schmidlapp     typedef struct pthread_cond_t_ * pthread_cond_t;
408062c5bc4SJason Schmidlapp     typedef struct pthread_condattr_t_ * pthread_condattr_t;
409062c5bc4SJason Schmidlapp     typedef struct pthread_rwlock_t_ * pthread_rwlock_t;
410062c5bc4SJason Schmidlapp     typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t;
411062c5bc4SJason Schmidlapp     typedef struct pthread_spinlock_t_ * pthread_spinlock_t;
412062c5bc4SJason Schmidlapp     typedef struct pthread_barrier_t_ * pthread_barrier_t;
413062c5bc4SJason Schmidlapp     typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t;
414062c5bc4SJason Schmidlapp 
415062c5bc4SJason Schmidlapp     /*
416062c5bc4SJason Schmidlapp      * ====================
417062c5bc4SJason Schmidlapp      * ====================
418062c5bc4SJason Schmidlapp      * POSIX Threads
419062c5bc4SJason Schmidlapp      * ====================
420062c5bc4SJason Schmidlapp      * ====================
421062c5bc4SJason Schmidlapp      */
422062c5bc4SJason Schmidlapp 
423062c5bc4SJason Schmidlapp     enum
424062c5bc4SJason Schmidlapp     {
425062c5bc4SJason Schmidlapp       /*
426062c5bc4SJason Schmidlapp        * pthread_attr_{get,set}detachstate
427062c5bc4SJason Schmidlapp        */
428062c5bc4SJason Schmidlapp       PTHREAD_CREATE_JOINABLE       = 0,  /* Default */
429062c5bc4SJason Schmidlapp       PTHREAD_CREATE_DETACHED       = 1,
430062c5bc4SJason Schmidlapp 
431062c5bc4SJason Schmidlapp       /*
432062c5bc4SJason Schmidlapp        * pthread_attr_{get,set}inheritsched
433062c5bc4SJason Schmidlapp        */
434062c5bc4SJason Schmidlapp       PTHREAD_INHERIT_SCHED         = 0,
435062c5bc4SJason Schmidlapp       PTHREAD_EXPLICIT_SCHED        = 1,  /* Default */
436062c5bc4SJason Schmidlapp 
437062c5bc4SJason Schmidlapp       /*
438062c5bc4SJason Schmidlapp        * pthread_{get,set}scope
439062c5bc4SJason Schmidlapp        */
440062c5bc4SJason Schmidlapp       PTHREAD_SCOPE_PROCESS         = 0,
441062c5bc4SJason Schmidlapp       PTHREAD_SCOPE_SYSTEM          = 1,  /* Default */
442062c5bc4SJason Schmidlapp       PTHREAD_SCOPE_PROCESS_VFPU    = 2,  /* PSP specific */
443062c5bc4SJason Schmidlapp 
444062c5bc4SJason Schmidlapp       /*
445062c5bc4SJason Schmidlapp        * pthread_setcancelstate paramters
446062c5bc4SJason Schmidlapp        */
447062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_ENABLE         = 0,  /* Default */
448062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_DISABLE        = 1,
449062c5bc4SJason Schmidlapp 
450062c5bc4SJason Schmidlapp       /*
451062c5bc4SJason Schmidlapp        * pthread_setcanceltype parameters
452062c5bc4SJason Schmidlapp        */
453062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_ASYNCHRONOUS   = 0,
454062c5bc4SJason Schmidlapp       PTHREAD_CANCEL_DEFERRED       = 1,  /* Default */
455062c5bc4SJason Schmidlapp 
456062c5bc4SJason Schmidlapp       /*
457062c5bc4SJason Schmidlapp        * pthread_mutexattr_{get,set}pshared
458062c5bc4SJason Schmidlapp        * pthread_condattr_{get,set}pshared
459062c5bc4SJason Schmidlapp        */
460062c5bc4SJason Schmidlapp       PTHREAD_PROCESS_PRIVATE       = 0,
461062c5bc4SJason Schmidlapp       PTHREAD_PROCESS_SHARED        = 1,
462062c5bc4SJason Schmidlapp 
463062c5bc4SJason Schmidlapp       /*
464062c5bc4SJason Schmidlapp        * pthread_barrier_wait
465062c5bc4SJason Schmidlapp        */
466062c5bc4SJason Schmidlapp       PTHREAD_BARRIER_SERIAL_THREAD = -1
467062c5bc4SJason Schmidlapp     };
468062c5bc4SJason Schmidlapp 
469062c5bc4SJason Schmidlapp     /*
470062c5bc4SJason Schmidlapp      * ====================
471062c5bc4SJason Schmidlapp      * ====================
472062c5bc4SJason Schmidlapp      * Cancelation
473062c5bc4SJason Schmidlapp      * ====================
474062c5bc4SJason Schmidlapp      * ====================
475062c5bc4SJason Schmidlapp      */
476062c5bc4SJason Schmidlapp #define PTHREAD_CANCELED       ((void *) -1)
477062c5bc4SJason Schmidlapp 
478062c5bc4SJason Schmidlapp 
479062c5bc4SJason Schmidlapp     /*
480062c5bc4SJason Schmidlapp      * ====================
481062c5bc4SJason Schmidlapp      * ====================
482062c5bc4SJason Schmidlapp      * Once Key
483062c5bc4SJason Schmidlapp      * ====================
484062c5bc4SJason Schmidlapp      * ====================
485062c5bc4SJason Schmidlapp      */
486062c5bc4SJason Schmidlapp #define PTHREAD_ONCE_INIT       { PTE_FALSE, 0, 0, 0}
487062c5bc4SJason Schmidlapp 
488062c5bc4SJason Schmidlapp     struct pthread_once_t_
489062c5bc4SJason Schmidlapp       {
490062c5bc4SJason Schmidlapp         int          state;
491062c5bc4SJason Schmidlapp         void *       semaphore;
492062c5bc4SJason Schmidlapp         int 		   numSemaphoreUsers;
493062c5bc4SJason Schmidlapp         int          done;        /* indicates if user function has been executed */
494062c5bc4SJason Schmidlapp //  void *       lock;
495062c5bc4SJason Schmidlapp //  int          reserved1;
496062c5bc4SJason Schmidlapp //  int          reserved2;
497062c5bc4SJason Schmidlapp       };
498062c5bc4SJason Schmidlapp 
499062c5bc4SJason Schmidlapp 
500062c5bc4SJason Schmidlapp     /*
501062c5bc4SJason Schmidlapp      * ====================
502062c5bc4SJason Schmidlapp      * ====================
503062c5bc4SJason Schmidlapp      * Object initialisers
504062c5bc4SJason Schmidlapp      * ====================
505062c5bc4SJason Schmidlapp      * ====================
506062c5bc4SJason Schmidlapp      */
507062c5bc4SJason Schmidlapp #define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1)
508062c5bc4SJason Schmidlapp #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t) -2)
509062c5bc4SJason Schmidlapp #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t) -3)
510062c5bc4SJason Schmidlapp 
511062c5bc4SJason Schmidlapp     /*
512062c5bc4SJason Schmidlapp      * Compatibility with LinuxThreads
513062c5bc4SJason Schmidlapp      */
514062c5bc4SJason Schmidlapp #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER
515062c5bc4SJason Schmidlapp #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER
516062c5bc4SJason Schmidlapp 
517062c5bc4SJason Schmidlapp #define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1)
518062c5bc4SJason Schmidlapp 
519062c5bc4SJason Schmidlapp #define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1)
520062c5bc4SJason Schmidlapp 
521062c5bc4SJason Schmidlapp #define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1)
522062c5bc4SJason Schmidlapp 
523062c5bc4SJason Schmidlapp 
524062c5bc4SJason Schmidlapp     /*
525062c5bc4SJason Schmidlapp      * Mutex types.
526062c5bc4SJason Schmidlapp      */
527062c5bc4SJason Schmidlapp     enum
528062c5bc4SJason Schmidlapp     {
529062c5bc4SJason Schmidlapp       /* Compatibility with LinuxThreads */
530062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_FAST_NP,
531062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_RECURSIVE_NP,
532062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_ERRORCHECK_NP,
533062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP,
534062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP,
535062c5bc4SJason Schmidlapp       /* For compatibility with POSIX */
536062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP,
537062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
538062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
539062c5bc4SJason Schmidlapp       PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
540062c5bc4SJason Schmidlapp     };
541062c5bc4SJason Schmidlapp 
542062c5bc4SJason Schmidlapp 
543062c5bc4SJason Schmidlapp     typedef struct pte_cleanup_t pte_cleanup_t;
544062c5bc4SJason Schmidlapp 
545062c5bc4SJason Schmidlapp     typedef void (*  pte_cleanup_callback_t)(void *);
546062c5bc4SJason Schmidlapp 
547062c5bc4SJason Schmidlapp     struct pte_cleanup_t
548062c5bc4SJason Schmidlapp       {
549062c5bc4SJason Schmidlapp         pte_cleanup_callback_t routine;
550062c5bc4SJason Schmidlapp         void *arg;
551062c5bc4SJason Schmidlapp         struct pte_cleanup_t *prev;
552062c5bc4SJason Schmidlapp       };
553062c5bc4SJason Schmidlapp 
554062c5bc4SJason Schmidlapp #ifdef PTE_CLEANUP_C
555062c5bc4SJason Schmidlapp 
556062c5bc4SJason Schmidlapp     /*
557062c5bc4SJason Schmidlapp      * C implementation of PThreads cancel cleanup
558062c5bc4SJason Schmidlapp      */
559062c5bc4SJason Schmidlapp 
560062c5bc4SJason Schmidlapp #define pthread_cleanup_push( _rout, _arg ) \
561062c5bc4SJason Schmidlapp         { \
562062c5bc4SJason Schmidlapp             pte_cleanup_t     _cleanup; \
563062c5bc4SJason Schmidlapp             \
564062c5bc4SJason Schmidlapp             pte_push_cleanup( &_cleanup, (pte_cleanup_callback_t) (_rout), (_arg) ); \
565062c5bc4SJason Schmidlapp 
566062c5bc4SJason Schmidlapp #define pthread_cleanup_pop( _execute ) \
567062c5bc4SJason Schmidlapp             (void) pte_pop_cleanup( _execute ); \
568062c5bc4SJason Schmidlapp         }
569062c5bc4SJason Schmidlapp 
570062c5bc4SJason Schmidlapp #else /* PTE_CLEANUP_C */
571062c5bc4SJason Schmidlapp 
572062c5bc4SJason Schmidlapp #ifdef PTE_CLEANUP_CXX
573062c5bc4SJason Schmidlapp 
574062c5bc4SJason Schmidlapp     /*
575062c5bc4SJason Schmidlapp     * C++ version of cancel cleanup.
576062c5bc4SJason Schmidlapp     * - John E. Bossom.
577062c5bc4SJason Schmidlapp     */
578062c5bc4SJason Schmidlapp 
579062c5bc4SJason Schmidlapp     class PThreadCleanup
580062c5bc4SJason Schmidlapp       {
581062c5bc4SJason Schmidlapp         /*
582062c5bc4SJason Schmidlapp         * PThreadCleanup
583062c5bc4SJason Schmidlapp         *
584062c5bc4SJason Schmidlapp         * Purpose
585062c5bc4SJason Schmidlapp         *      This class is a C++ helper class that is
586062c5bc4SJason Schmidlapp         *      used to implement pthread_cleanup_push/
587062c5bc4SJason Schmidlapp         *      pthread_cleanup_pop.
588062c5bc4SJason Schmidlapp         *      The destructor of this class automatically
589062c5bc4SJason Schmidlapp         *      pops the pushed cleanup routine regardless
590062c5bc4SJason Schmidlapp         *      of how the code exits the scope
591062c5bc4SJason Schmidlapp         *      (i.e. such as by an exception)
592062c5bc4SJason Schmidlapp         */
593062c5bc4SJason Schmidlapp         pte_cleanup_callback_t cleanUpRout;
594062c5bc4SJason Schmidlapp         void    *       obj;
595062c5bc4SJason Schmidlapp         int             executeIt;
596062c5bc4SJason Schmidlapp 
597062c5bc4SJason Schmidlapp       public:
598062c5bc4SJason Schmidlapp         PThreadCleanup() :
599062c5bc4SJason Schmidlapp             cleanUpRout( 0 ),
600062c5bc4SJason Schmidlapp             obj( 0 ),
601062c5bc4SJason Schmidlapp             executeIt( 0 )
602062c5bc4SJason Schmidlapp             /*
603062c5bc4SJason Schmidlapp             * No cleanup performed
604062c5bc4SJason Schmidlapp             */
605062c5bc4SJason Schmidlapp         {
606062c5bc4SJason Schmidlapp         }
607062c5bc4SJason Schmidlapp 
608062c5bc4SJason Schmidlapp         PThreadCleanup(
609062c5bc4SJason Schmidlapp           pte_cleanup_callback_t routine,
610062c5bc4SJason Schmidlapp           void    *       arg ) :
611062c5bc4SJason Schmidlapp             cleanUpRout( routine ),
612062c5bc4SJason Schmidlapp             obj( arg ),
613062c5bc4SJason Schmidlapp             executeIt( 1 )
614062c5bc4SJason Schmidlapp             /*
615062c5bc4SJason Schmidlapp             * Registers a cleanup routine for 'arg'
616062c5bc4SJason Schmidlapp             */
617062c5bc4SJason Schmidlapp         {
618062c5bc4SJason Schmidlapp         }
619062c5bc4SJason Schmidlapp 
620062c5bc4SJason Schmidlapp         ~PThreadCleanup()
621062c5bc4SJason Schmidlapp         {
622062c5bc4SJason Schmidlapp           if ( executeIt )
623062c5bc4SJason Schmidlapp             {
624062c5bc4SJason Schmidlapp               (void) (*cleanUpRout)( obj );
625062c5bc4SJason Schmidlapp             }
626062c5bc4SJason Schmidlapp         }
627062c5bc4SJason Schmidlapp 
628062c5bc4SJason Schmidlapp         void execute( int exec )
629062c5bc4SJason Schmidlapp         {
630062c5bc4SJason Schmidlapp           executeIt = exec;
631062c5bc4SJason Schmidlapp         }
632062c5bc4SJason Schmidlapp       };
633062c5bc4SJason Schmidlapp 
634062c5bc4SJason Schmidlapp     /*
635062c5bc4SJason Schmidlapp     * C++ implementation of PThreads cancel cleanup;
636062c5bc4SJason Schmidlapp     * This implementation takes advantage of a helper
637062c5bc4SJason Schmidlapp     * class who's destructor automatically calls the
638062c5bc4SJason Schmidlapp     * cleanup routine if we exit our scope weirdly
639062c5bc4SJason Schmidlapp     */
640062c5bc4SJason Schmidlapp #define pthread_cleanup_push( _rout, _arg ) \
641062c5bc4SJason Schmidlapp         { \
642062c5bc4SJason Schmidlapp             PThreadCleanup  cleanup((pte_cleanup_callback_t)(_rout), \
643062c5bc4SJason Schmidlapp                                     (void *) (_arg) );
644062c5bc4SJason Schmidlapp 
645062c5bc4SJason Schmidlapp #define pthread_cleanup_pop( _execute ) \
646062c5bc4SJason Schmidlapp             cleanup.execute( _execute ); \
647062c5bc4SJason Schmidlapp         }
648062c5bc4SJason Schmidlapp 
649062c5bc4SJason Schmidlapp #else
650062c5bc4SJason Schmidlapp 
651062c5bc4SJason Schmidlapp #error ERROR [__FILE__, line __LINE__]: Cleanup type undefined.
652062c5bc4SJason Schmidlapp 
653062c5bc4SJason Schmidlapp #endif /* PTE_CLEANUP_CXX */
654062c5bc4SJason Schmidlapp 
655062c5bc4SJason Schmidlapp #endif /* PTE_CLEANUP_C */
656062c5bc4SJason Schmidlapp 
657747ec726SJason Schmidlapp #ifdef __cplusplus
658747ec726SJason Schmidlapp extern "C" {
659747ec726SJason Schmidlapp #endif /* __cplusplus */
660747ec726SJason Schmidlapp 
661062c5bc4SJason Schmidlapp     /*
662062c5bc4SJason Schmidlapp      * ===============
663062c5bc4SJason Schmidlapp      * ===============
664062c5bc4SJason Schmidlapp      * Methods
665062c5bc4SJason Schmidlapp      * ===============
666062c5bc4SJason Schmidlapp      * ===============
667062c5bc4SJason Schmidlapp      */
668062c5bc4SJason Schmidlapp 
669*dc52dd28SJeremy Soller     void  pthread_init (void);
670062c5bc4SJason Schmidlapp     void  pthread_terminate (void);
671062c5bc4SJason Schmidlapp 
672062c5bc4SJason Schmidlapp     /*
673062c5bc4SJason Schmidlapp      * PThread Attribute Functions
674062c5bc4SJason Schmidlapp      */
675062c5bc4SJason Schmidlapp     int  pthread_attr_init (pthread_attr_t * attr);
676062c5bc4SJason Schmidlapp 
677062c5bc4SJason Schmidlapp     int  pthread_attr_destroy (pthread_attr_t * attr);
678062c5bc4SJason Schmidlapp 
679062c5bc4SJason Schmidlapp     int  pthread_attr_getdetachstate (const pthread_attr_t * attr,
680062c5bc4SJason Schmidlapp                                       int *detachstate);
681062c5bc4SJason Schmidlapp 
682062c5bc4SJason Schmidlapp     int  pthread_attr_getstackaddr (const pthread_attr_t * attr,
683062c5bc4SJason Schmidlapp                                     void **stackaddr);
684062c5bc4SJason Schmidlapp 
685062c5bc4SJason Schmidlapp     int  pthread_attr_getstacksize (const pthread_attr_t * attr,
686062c5bc4SJason Schmidlapp                                     size_t * stacksize);
687062c5bc4SJason Schmidlapp 
688062c5bc4SJason Schmidlapp     int  pthread_attr_setdetachstate (pthread_attr_t * attr,
689062c5bc4SJason Schmidlapp                                       int detachstate);
690062c5bc4SJason Schmidlapp 
691062c5bc4SJason Schmidlapp     int  pthread_attr_setstackaddr (pthread_attr_t * attr,
692062c5bc4SJason Schmidlapp                                     void *stackaddr);
693062c5bc4SJason Schmidlapp 
694062c5bc4SJason Schmidlapp     int  pthread_attr_setstacksize (pthread_attr_t * attr,
695062c5bc4SJason Schmidlapp                                     size_t stacksize);
696062c5bc4SJason Schmidlapp 
697062c5bc4SJason Schmidlapp     int  pthread_attr_getschedparam (const pthread_attr_t *attr,
698062c5bc4SJason Schmidlapp                                      struct sched_param *param);
699062c5bc4SJason Schmidlapp 
700062c5bc4SJason Schmidlapp     int  pthread_attr_setschedparam (pthread_attr_t *attr,
701062c5bc4SJason Schmidlapp                                      const struct sched_param *param);
702062c5bc4SJason Schmidlapp 
703062c5bc4SJason Schmidlapp     int  pthread_attr_setschedpolicy (pthread_attr_t *,
704062c5bc4SJason Schmidlapp                                       int);
705062c5bc4SJason Schmidlapp 
706062c5bc4SJason Schmidlapp     int  pthread_attr_getschedpolicy (pthread_attr_t *,
707062c5bc4SJason Schmidlapp                                       int *);
708062c5bc4SJason Schmidlapp 
709062c5bc4SJason Schmidlapp     int  pthread_attr_setinheritsched(pthread_attr_t * attr,
710062c5bc4SJason Schmidlapp                                       int inheritsched);
711062c5bc4SJason Schmidlapp 
712062c5bc4SJason Schmidlapp     int  pthread_attr_getinheritsched(pthread_attr_t * attr,
713062c5bc4SJason Schmidlapp                                       int * inheritsched);
714062c5bc4SJason Schmidlapp 
715062c5bc4SJason Schmidlapp     int  pthread_attr_setscope (pthread_attr_t *,
716062c5bc4SJason Schmidlapp                                 int);
717062c5bc4SJason Schmidlapp 
718062c5bc4SJason Schmidlapp     int  pthread_attr_getscope (const pthread_attr_t *,
719062c5bc4SJason Schmidlapp                                 int *);
720062c5bc4SJason Schmidlapp 
721062c5bc4SJason Schmidlapp     /*
722062c5bc4SJason Schmidlapp      * PThread Functions
723062c5bc4SJason Schmidlapp      */
724062c5bc4SJason Schmidlapp     int  pthread_create (pthread_t * tid,
725062c5bc4SJason Schmidlapp                          const pthread_attr_t * attr,
726062c5bc4SJason Schmidlapp                          void *(*start) (void *),
727062c5bc4SJason Schmidlapp                          void *arg);
728062c5bc4SJason Schmidlapp 
729062c5bc4SJason Schmidlapp     int  pthread_detach (pthread_t tid);
730062c5bc4SJason Schmidlapp 
731062c5bc4SJason Schmidlapp     int  pthread_equal (pthread_t t1,
732062c5bc4SJason Schmidlapp                         pthread_t t2);
733062c5bc4SJason Schmidlapp 
734062c5bc4SJason Schmidlapp     void  pthread_exit (void *value_ptr);
735062c5bc4SJason Schmidlapp 
736062c5bc4SJason Schmidlapp     int  pthread_join (pthread_t thread,
737062c5bc4SJason Schmidlapp                        void **value_ptr);
738062c5bc4SJason Schmidlapp 
739062c5bc4SJason Schmidlapp     pthread_t  pthread_self (void);
740062c5bc4SJason Schmidlapp 
741062c5bc4SJason Schmidlapp     int  pthread_cancel (pthread_t thread);
742062c5bc4SJason Schmidlapp 
743062c5bc4SJason Schmidlapp     int  pthread_setcancelstate (int state,
744062c5bc4SJason Schmidlapp                                  int *oldstate);
745062c5bc4SJason Schmidlapp 
746062c5bc4SJason Schmidlapp     int  pthread_setcanceltype (int type,
747062c5bc4SJason Schmidlapp                                 int *oldtype);
748062c5bc4SJason Schmidlapp 
749062c5bc4SJason Schmidlapp     void  pthread_testcancel (void);
750062c5bc4SJason Schmidlapp 
751062c5bc4SJason Schmidlapp     int  pthread_once (pthread_once_t * once_control,
752062c5bc4SJason Schmidlapp                        void (*init_routine) (void));
753062c5bc4SJason Schmidlapp 
754062c5bc4SJason Schmidlapp #if PTE_LEVEL >= PTE_LEVEL_MAX
755062c5bc4SJason Schmidlapp     pte_cleanup_t *  pte_pop_cleanup (int execute);
756062c5bc4SJason Schmidlapp 
757062c5bc4SJason Schmidlapp     void  pte_push_cleanup (pte_cleanup_t * cleanup,
758062c5bc4SJason Schmidlapp                             void (*routine) (void *),
759062c5bc4SJason Schmidlapp                             void *arg);
760062c5bc4SJason Schmidlapp #endif /* PTE_LEVEL >= PTE_LEVEL_MAX */
761062c5bc4SJason Schmidlapp 
762062c5bc4SJason Schmidlapp     /*
763062c5bc4SJason Schmidlapp      * Thread Specific Data Functions
764062c5bc4SJason Schmidlapp      */
765062c5bc4SJason Schmidlapp     int  pthread_key_create (pthread_key_t * key,
766062c5bc4SJason Schmidlapp                              void (*destructor) (void *));
767062c5bc4SJason Schmidlapp 
768062c5bc4SJason Schmidlapp     int  pthread_key_delete (pthread_key_t key);
769062c5bc4SJason Schmidlapp 
770062c5bc4SJason Schmidlapp     int  pthread_setspecific (pthread_key_t key,
771062c5bc4SJason Schmidlapp                               const void *value);
772062c5bc4SJason Schmidlapp 
773062c5bc4SJason Schmidlapp     void *  pthread_getspecific (pthread_key_t key);
774062c5bc4SJason Schmidlapp 
775062c5bc4SJason Schmidlapp 
776062c5bc4SJason Schmidlapp     /*
777062c5bc4SJason Schmidlapp      * Mutex Attribute Functions
778062c5bc4SJason Schmidlapp      */
779062c5bc4SJason Schmidlapp     int  pthread_mutexattr_init (pthread_mutexattr_t * attr);
780062c5bc4SJason Schmidlapp 
781062c5bc4SJason Schmidlapp     int  pthread_mutexattr_destroy (pthread_mutexattr_t * attr);
782062c5bc4SJason Schmidlapp 
783062c5bc4SJason Schmidlapp     int  pthread_mutexattr_getpshared (const pthread_mutexattr_t
784062c5bc4SJason Schmidlapp                                        * attr,
785062c5bc4SJason Schmidlapp                                        int *pshared);
786062c5bc4SJason Schmidlapp 
787062c5bc4SJason Schmidlapp     int  pthread_mutexattr_setpshared (pthread_mutexattr_t * attr,
788062c5bc4SJason Schmidlapp                                        int pshared);
789062c5bc4SJason Schmidlapp 
790062c5bc4SJason Schmidlapp     int  pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);
791062c5bc4SJason Schmidlapp     int  pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind);
792062c5bc4SJason Schmidlapp 
793062c5bc4SJason Schmidlapp     /*
794062c5bc4SJason Schmidlapp      * Barrier Attribute Functions
795062c5bc4SJason Schmidlapp      */
796062c5bc4SJason Schmidlapp     int  pthread_barrierattr_init (pthread_barrierattr_t * attr);
797062c5bc4SJason Schmidlapp 
798062c5bc4SJason Schmidlapp     int  pthread_barrierattr_destroy (pthread_barrierattr_t * attr);
799062c5bc4SJason Schmidlapp 
800062c5bc4SJason Schmidlapp     int  pthread_barrierattr_getpshared (const pthread_barrierattr_t
801062c5bc4SJason Schmidlapp                                          * attr,
802062c5bc4SJason Schmidlapp                                          int *pshared);
803062c5bc4SJason Schmidlapp 
804062c5bc4SJason Schmidlapp     int  pthread_barrierattr_setpshared (pthread_barrierattr_t * attr,
805062c5bc4SJason Schmidlapp                                          int pshared);
806062c5bc4SJason Schmidlapp 
807062c5bc4SJason Schmidlapp     /*
808062c5bc4SJason Schmidlapp      * Mutex Functions
809062c5bc4SJason Schmidlapp      */
810062c5bc4SJason Schmidlapp     int  pthread_mutex_init (pthread_mutex_t * mutex,
811062c5bc4SJason Schmidlapp                              const pthread_mutexattr_t * attr);
812062c5bc4SJason Schmidlapp 
813062c5bc4SJason Schmidlapp     int  pthread_mutex_destroy (pthread_mutex_t * mutex);
814062c5bc4SJason Schmidlapp 
815062c5bc4SJason Schmidlapp     int  pthread_mutex_lock (pthread_mutex_t * mutex);
816062c5bc4SJason Schmidlapp 
817062c5bc4SJason Schmidlapp     int  pthread_mutex_timedlock(pthread_mutex_t *mutex,
818062c5bc4SJason Schmidlapp                                  const struct timespec *abstime);
819062c5bc4SJason Schmidlapp 
820062c5bc4SJason Schmidlapp     int  pthread_mutex_trylock (pthread_mutex_t * mutex);
821062c5bc4SJason Schmidlapp 
822062c5bc4SJason Schmidlapp     int  pthread_mutex_unlock (pthread_mutex_t * mutex);
823062c5bc4SJason Schmidlapp 
824062c5bc4SJason Schmidlapp     /*
825062c5bc4SJason Schmidlapp      * Spinlock Functions
826062c5bc4SJason Schmidlapp      */
827062c5bc4SJason Schmidlapp     int  pthread_spin_init (pthread_spinlock_t * lock, int pshared);
828062c5bc4SJason Schmidlapp 
829062c5bc4SJason Schmidlapp     int  pthread_spin_destroy (pthread_spinlock_t * lock);
830062c5bc4SJason Schmidlapp 
831062c5bc4SJason Schmidlapp     int  pthread_spin_lock (pthread_spinlock_t * lock);
832062c5bc4SJason Schmidlapp 
833062c5bc4SJason Schmidlapp     int  pthread_spin_trylock (pthread_spinlock_t * lock);
834062c5bc4SJason Schmidlapp 
835062c5bc4SJason Schmidlapp     int  pthread_spin_unlock (pthread_spinlock_t * lock);
836062c5bc4SJason Schmidlapp 
837062c5bc4SJason Schmidlapp     /*
838062c5bc4SJason Schmidlapp      * Barrier Functions
839062c5bc4SJason Schmidlapp      */
840062c5bc4SJason Schmidlapp     int  pthread_barrier_init (pthread_barrier_t * barrier,
841062c5bc4SJason Schmidlapp                                const pthread_barrierattr_t * attr,
842062c5bc4SJason Schmidlapp                                unsigned int count);
843062c5bc4SJason Schmidlapp 
844062c5bc4SJason Schmidlapp     int  pthread_barrier_destroy (pthread_barrier_t * barrier);
845062c5bc4SJason Schmidlapp 
846062c5bc4SJason Schmidlapp     int  pthread_barrier_wait (pthread_barrier_t * barrier);
847062c5bc4SJason Schmidlapp 
848062c5bc4SJason Schmidlapp     /*
849062c5bc4SJason Schmidlapp      * Condition Variable Attribute Functions
850062c5bc4SJason Schmidlapp      */
851062c5bc4SJason Schmidlapp     int  pthread_condattr_init (pthread_condattr_t * attr);
852062c5bc4SJason Schmidlapp 
853062c5bc4SJason Schmidlapp     int  pthread_condattr_destroy (pthread_condattr_t * attr);
854062c5bc4SJason Schmidlapp 
855062c5bc4SJason Schmidlapp     int  pthread_condattr_getpshared (const pthread_condattr_t * attr,
856062c5bc4SJason Schmidlapp                                       int *pshared);
857062c5bc4SJason Schmidlapp 
858062c5bc4SJason Schmidlapp     int  pthread_condattr_setpshared (pthread_condattr_t * attr,
859062c5bc4SJason Schmidlapp                                       int pshared);
860062c5bc4SJason Schmidlapp 
861062c5bc4SJason Schmidlapp     /*
862062c5bc4SJason Schmidlapp      * Condition Variable Functions
863062c5bc4SJason Schmidlapp      */
864062c5bc4SJason Schmidlapp     int  pthread_cond_init (pthread_cond_t * cond,
865062c5bc4SJason Schmidlapp                             const pthread_condattr_t * attr);
866062c5bc4SJason Schmidlapp 
867062c5bc4SJason Schmidlapp     int  pthread_cond_destroy (pthread_cond_t * cond);
868062c5bc4SJason Schmidlapp 
869062c5bc4SJason Schmidlapp     int  pthread_cond_wait (pthread_cond_t * cond,
870062c5bc4SJason Schmidlapp                             pthread_mutex_t * mutex);
871062c5bc4SJason Schmidlapp 
872062c5bc4SJason Schmidlapp     int  pthread_cond_timedwait (pthread_cond_t * cond,
873062c5bc4SJason Schmidlapp                                  pthread_mutex_t * mutex,
874062c5bc4SJason Schmidlapp                                  const struct timespec *abstime);
875062c5bc4SJason Schmidlapp 
876062c5bc4SJason Schmidlapp     int  pthread_cond_signal (pthread_cond_t * cond);
877062c5bc4SJason Schmidlapp 
878062c5bc4SJason Schmidlapp     int  pthread_cond_broadcast (pthread_cond_t * cond);
879062c5bc4SJason Schmidlapp 
880062c5bc4SJason Schmidlapp     /*
881062c5bc4SJason Schmidlapp      * Scheduling
882062c5bc4SJason Schmidlapp      */
883062c5bc4SJason Schmidlapp     int  pthread_setschedparam (pthread_t thread,
884062c5bc4SJason Schmidlapp                                 int policy,
885062c5bc4SJason Schmidlapp                                 const struct sched_param *param);
886062c5bc4SJason Schmidlapp 
887062c5bc4SJason Schmidlapp     int  pthread_getschedparam (pthread_t thread,
888062c5bc4SJason Schmidlapp                                 int *policy,
889062c5bc4SJason Schmidlapp                                 struct sched_param *param);
890062c5bc4SJason Schmidlapp 
891062c5bc4SJason Schmidlapp     int  pthread_setconcurrency (int);
892062c5bc4SJason Schmidlapp 
893062c5bc4SJason Schmidlapp     int  pthread_getconcurrency (void);
894062c5bc4SJason Schmidlapp 
895062c5bc4SJason Schmidlapp     /*
896062c5bc4SJason Schmidlapp      * Read-Write Lock Functions
897062c5bc4SJason Schmidlapp      */
898062c5bc4SJason Schmidlapp     int  pthread_rwlock_init(pthread_rwlock_t *lock,
899062c5bc4SJason Schmidlapp                              const pthread_rwlockattr_t *attr);
900062c5bc4SJason Schmidlapp 
901062c5bc4SJason Schmidlapp     int  pthread_rwlock_destroy(pthread_rwlock_t *lock);
902062c5bc4SJason Schmidlapp 
903062c5bc4SJason Schmidlapp     int  pthread_rwlock_tryrdlock(pthread_rwlock_t *);
904062c5bc4SJason Schmidlapp 
905062c5bc4SJason Schmidlapp     int  pthread_rwlock_trywrlock(pthread_rwlock_t *);
906062c5bc4SJason Schmidlapp 
907062c5bc4SJason Schmidlapp     int  pthread_rwlock_rdlock(pthread_rwlock_t *lock);
908062c5bc4SJason Schmidlapp 
909062c5bc4SJason Schmidlapp     int  pthread_rwlock_timedrdlock(pthread_rwlock_t *lock,
910062c5bc4SJason Schmidlapp                                     const struct timespec *abstime);
911062c5bc4SJason Schmidlapp 
912062c5bc4SJason Schmidlapp     int  pthread_rwlock_wrlock(pthread_rwlock_t *lock);
913062c5bc4SJason Schmidlapp 
914062c5bc4SJason Schmidlapp     int  pthread_rwlock_timedwrlock(pthread_rwlock_t *lock,
915062c5bc4SJason Schmidlapp                                     const struct timespec *abstime);
916062c5bc4SJason Schmidlapp 
917062c5bc4SJason Schmidlapp     int  pthread_rwlock_unlock(pthread_rwlock_t *lock);
918062c5bc4SJason Schmidlapp 
919062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_init (pthread_rwlockattr_t * attr);
920062c5bc4SJason Schmidlapp 
921062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr);
922062c5bc4SJason Schmidlapp 
923062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr,
924062c5bc4SJason Schmidlapp                                         int *pshared);
925062c5bc4SJason Schmidlapp 
926062c5bc4SJason Schmidlapp     int  pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr,
927062c5bc4SJason Schmidlapp                                         int pshared);
928062c5bc4SJason Schmidlapp 
929062c5bc4SJason Schmidlapp #if PTE_LEVEL >= PTE_LEVEL_MAX - 1
930062c5bc4SJason Schmidlapp 
931062c5bc4SJason Schmidlapp     /*
932062c5bc4SJason Schmidlapp      * Signal Functions. Should be defined in <signal.h> but we might
933062c5bc4SJason Schmidlapp      * already have signal.h that don't define these.
934062c5bc4SJason Schmidlapp      */
935062c5bc4SJason Schmidlapp     int  pthread_kill(pthread_t thread, int sig);
936062c5bc4SJason Schmidlapp 
937062c5bc4SJason Schmidlapp     /*
938062c5bc4SJason Schmidlapp      * Non-portable functions
939062c5bc4SJason Schmidlapp      */
940062c5bc4SJason Schmidlapp 
941062c5bc4SJason Schmidlapp     /*
942062c5bc4SJason Schmidlapp      * Compatibility with Linux.
943062c5bc4SJason Schmidlapp      */
944062c5bc4SJason Schmidlapp     int  pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr,
945062c5bc4SJason Schmidlapp                                       int kind);
946062c5bc4SJason Schmidlapp     int  pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr,
947062c5bc4SJason Schmidlapp                                       int *kind);
948062c5bc4SJason Schmidlapp 
949062c5bc4SJason Schmidlapp     /*
950062c5bc4SJason Schmidlapp      * Possibly supported by other POSIX threads implementations
951062c5bc4SJason Schmidlapp      */
952062c5bc4SJason Schmidlapp     int  pthread_delay_np (struct timespec * interval);
953062c5bc4SJason Schmidlapp     int  pthread_num_processors_np(void);
954062c5bc4SJason Schmidlapp 
955062c5bc4SJason Schmidlapp     /*
956062c5bc4SJason Schmidlapp      * Register a system time change with the library.
957062c5bc4SJason Schmidlapp      * Causes the library to perform various functions
958062c5bc4SJason Schmidlapp      * in response to the change. Should be called whenever
959062c5bc4SJason Schmidlapp      * the application's top level window receives a
960062c5bc4SJason Schmidlapp      * WM_TIMECHANGE message. It can be passed directly to
961062c5bc4SJason Schmidlapp      * pthread_create() as a new thread if desired.
962062c5bc4SJason Schmidlapp      */
963062c5bc4SJason Schmidlapp     void *  pthread_timechange_handler_np(void *);
964062c5bc4SJason Schmidlapp 
965062c5bc4SJason Schmidlapp #endif /*PTE_LEVEL >= PTE_LEVEL_MAX - 1 */
966062c5bc4SJason Schmidlapp 
967747ec726SJason Schmidlapp #ifdef __cplusplus
968747ec726SJason Schmidlapp }
969747ec726SJason Schmidlapp #endif /* cplusplus */
970747ec726SJason Schmidlapp 
971062c5bc4SJason Schmidlapp #if PTE_LEVEL >= PTE_LEVEL_MAX
972062c5bc4SJason Schmidlapp 
973062c5bc4SJason Schmidlapp 
974062c5bc4SJason Schmidlapp 
975062c5bc4SJason Schmidlapp #endif /* PTE_LEVEL >= PTE_LEVEL_MAX */
976062c5bc4SJason Schmidlapp 
977062c5bc4SJason Schmidlapp     /*
978062c5bc4SJason Schmidlapp      * Some compiler environments don't define some things.
979062c5bc4SJason Schmidlapp      */
980062c5bc4SJason Schmidlapp #  define _ftime ftime
981062c5bc4SJason Schmidlapp #  define _timeb timeb
982062c5bc4SJason Schmidlapp 
983062c5bc4SJason Schmidlapp #ifdef __cplusplus
984062c5bc4SJason Schmidlapp 
985062c5bc4SJason Schmidlapp     /*
986062c5bc4SJason Schmidlapp      * Internal exceptions
987062c5bc4SJason Schmidlapp      */
988062c5bc4SJason Schmidlapp     class pte_exception {};
989062c5bc4SJason Schmidlapp     class pte_exception_cancel : public pte_exception {};
990062c5bc4SJason Schmidlapp     class pte_exception_exit   : public pte_exception {};
991062c5bc4SJason Schmidlapp 
992062c5bc4SJason Schmidlapp #endif
993062c5bc4SJason Schmidlapp 
994062c5bc4SJason Schmidlapp 
995714af18cSJason Schmidlapp #ifdef PTE_CXX_EXCEPTIONS
996062c5bc4SJason Schmidlapp 
997062c5bc4SJason Schmidlapp     /*
998062c5bc4SJason Schmidlapp      * Redefine the C++ catch keyword to ensure that applications
999062c5bc4SJason Schmidlapp      * propagate our internal exceptions up to the library's internal handlers.
1000062c5bc4SJason Schmidlapp      */
1001062c5bc4SJason Schmidlapp #define catch( E ) \
1002062c5bc4SJason Schmidlapp         catch( pte_exception & ) { throw; } \
1003062c5bc4SJason Schmidlapp         catch( E )
1004062c5bc4SJason Schmidlapp 
1005714af18cSJason Schmidlapp #endif /* ! PTE_CXX_EXCEPTIONS */
1006062c5bc4SJason Schmidlapp 
1007062c5bc4SJason Schmidlapp #undef PTE_LEVEL
1008062c5bc4SJason Schmidlapp #undef PTE_LEVEL_MAX
1009062c5bc4SJason Schmidlapp 
1010062c5bc4SJason Schmidlapp #endif /* PTHREAD_H */
1011