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