15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This is an implementation of the threads API of POSIX 1003.1-2001. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------------------------------------------------------------------------- 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pthreads-win32 - POSIX Threads Library for Win32 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright(C) 1998 John E. Bossom 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright(C) 1999,2005 Pthreads-win32 contributors 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contact Email: rpj@callisto.canberra.edu.au 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The current list of contributors is contained 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the file CONTRIBUTORS included with the source 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * code distribution. The list can also be seen at the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * following World Wide Web location: 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://sources.redhat.com/pthreads-win32/contributors.html 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is free software; you can redistribute it and/or 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modify it under the terms of the GNU Lesser General Public 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License as published by the Free Software Foundation; either 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version 2 of the License, or (at your option) any later version. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is distributed in the hope that it will be useful, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lesser General Public License for more details. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You should have received a copy of the GNU Lesser General Public 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License along with this library in the file COPYING.LIB; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not, write to the Free Software Foundation, Inc., 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined( PTHREAD_H ) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_H 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the README file for an explanation of the pthreads-win32 version 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * numbering scheme and how the DLL is named etc. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_VERSION 2,9,1,0 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_VERSION_STRING "2, 9, 1, 0\0" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* There are three implementations of cancel cleanup. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that pthread.h is included in both application 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compilation units and also internally for the library. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The code here and within the library aims to work 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for all reasonable combinations of environments. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The three implementations are: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WIN32 SEH 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C++ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Please note that exiting a push/pop block via 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "return", "exit", "break", or "continue" will 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * lead to different behaviour amongst applications 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * depending upon whether the library was built 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * using SEH, C++, or C. For example, a library built 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with SEH will call the cleanup routine, while both 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C++ and C built versions will not. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Define defaults for cleanup code. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note: Unless the build explicitly defines one of the following, then 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we default to standard C style cleanup. This style uses setjmp/longjmp 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the cancelation and thread exit implementations and therefore won't 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * do stack unwinding if linked to applications that have it (e.g. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C++ apps). This is currently consistent with most/all commercial Unix 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX threads implementations. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define __CLEANUP_C 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC)) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Stop here if we are being included by the resource compiler. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(RC_INVOKED) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_LEVEL 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_POSIX_SOURCE) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_LEVEL 0 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Early POSIX */ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_LEVEL 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_LEVEL 1 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include 1b, 1c and 1d */ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(INCLUDE_NP) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_LEVEL 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_LEVEL 2 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include Non-Portable extensions */ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_LEVEL_MAX 3 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_LEVEL) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_LEVEL PTW32_LEVEL_MAX 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include everything */ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_UWIN) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_STRUCT_TIMESPEC 1 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_SIGNAL_H 1 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef HAVE_PTW32_CONFIG_H 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pragma comment(lib, "pthread") 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------------- 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Module: pthread.h 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Purpose: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides an implementation of PThreads based upon the 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * standard: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX 1003.1-2001 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Single Unix Specification version 3 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (these two are equivalent) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in order to enhance code portability between Windows, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * various commercial Unix implementations, and Linux. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the ANNOUNCE file for a full list of conforming 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routines and defined constants, and a list of missing 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routines and constants not defined in this implementation. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Authors: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * There have been many contributors to this library. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The initial implementation was contributed by 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * John Bossom, and several others have provided major 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sections or revisions of parts of the implementation. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Often significant effort has been contributed to 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * find and fix important bugs and other problems to 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * improve the reliability of the library, which sometimes 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is not reflected in the amount of code which changed as 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * result. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * As much as possible, the contributors are acknowledged 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the ChangeLog file in the source code distribution 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * where their changes are noted in detail. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contributors are listed in the CONTRIBUTORS file. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * As usual, all bouquets go to the contributors, and all 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * brickbats go to the project maintainer. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Maintainer: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The code base for this project is coordinated and 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eventually pre-tested, packaged, and made available by 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Ross Johnson <rpj@callisto.canberra.edu.au> 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * QA Testers: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Ultimately, the library is tested in the real world by 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a host of competent and demanding scientists and 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * engineers who report bugs and/or provide solutions 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which are then fixed or incorporated into subsequent 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * versions of the library. Each time a bug is fixed, a 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * test case is written to prove the fix and ensure 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that later changes to the code don't reintroduce the 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * same error. The number of test cases is slowly growing 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and therefore so is the code reliability. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compliance: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the file ANNOUNCE for the list of implemented 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and not-implemented routines and defined options. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Of course, these are all defined is this file as well. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Web site: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The source code and other information about this library 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are available from 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://sources.redhat.com/pthreads-win32/ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------------- 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Try to avoid including windows.h */ 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(__MINGW64__) || defined(__MINGW32__)) && defined(__cplusplus) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_INCLUDE_WINDOWS_H 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PTW32_INCLUDE_WINDOWS_H) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * VC++6.0 or early compiler's header has no DWORD_PTR type. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long DWORD_PTR; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long ULONG_PTR; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ----------------- 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * autoconf switches 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ----------------- 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_PTW32_CONFIG_H) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_PTW32_CONFIG_H */ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NEED_FTIME) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h> 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* NEED_FTIME */ 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* use native WIN32 time API */ 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NEED_FTIME */ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_SIGNAL_H) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <signal.h> 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_SIGNAL_H */ 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits.h> 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Boolean values to make us independent of system includes. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTW32_FALSE = 0, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTW32_TRUE = (! PTW32_FALSE) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is a duplicate of what is in the autoconf config.h, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which is only used when building the pthread-win32 libraries. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_CONFIG_H) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(WINCE) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define NEED_ERRNO 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define NEED_SEM 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(__MINGW64__) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_STRUCT_TIMESPEC 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_MODE_T 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# elif defined(_UWIN) || defined(__MINGW32__) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_MODE_T 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_LEVEL >= PTW32_LEVEL_MAX 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NEED_ERRNO) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "need_errno.h" 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Several systems don't define some error numbers. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(ENOTSUP) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ENOTSUP 48 /* This is the value in Solaris. */ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(ETIMEDOUT) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ETIMEDOUT 10060 /* Same as WSAETIMEDOUT */ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(ENOSYS) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ENOSYS 140 /* Semi-arbitrary value */ 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(EDEADLK) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(EDEADLOCK) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EDEADLK EDEADLOCK 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EDEADLK 36 /* This is the value in MSVC. */ 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* POSIX 2008 - related to robust mutexes */ 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(EOWNERDEAD) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EOWNERDEAD 43 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(ENOTRECOVERABLE) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ENOTRECOVERABLE 44 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sched.h> 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * To avoid including windows.h we define only those things that we 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * actually need from it. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_INCLUDE_WINDOWS_H) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(HANDLE) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PTW32__HANDLE_DEF 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HANDLE void * 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DWORD) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PTW32__DWORD_DEF 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DWORD unsigned long 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(HAVE_STRUCT_TIMESPEC) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HAVE_STRUCT_TIMESPEC 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_TIMESPEC_DEFINED) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _TIMESPEC_DEFINED 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct timespec { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_t tv_sec; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long tv_nsec; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _TIMESPEC_DEFINED */ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_STRUCT_TIMESPEC */ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SIG_BLOCK) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIG_BLOCK 0 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SIG_BLOCK */ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SIG_UNBLOCK) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIG_UNBLOCK 1 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SIG_UNBLOCK */ 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SIG_SETMASK) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIG_SETMASK 2 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SIG_SETMASK */ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __cplusplus */ 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------------- 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX 1003.1-2001 Options 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ========================= 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Options are normally set in <unistd.h>, which is not provided 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with pthreads-win32. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conformance with the Single Unix Specification (version 3), all of the 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * options below are defined, and have a value of either -1 (not supported) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or 200112L (supported). 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * These options can neither be left undefined nor have a value of 0, because 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * either indicates that sysconf(), which is not implemented, may be used at 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * runtime to check the status of the option. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREADS (== 200112L) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can use threads 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can control the size of a thread's 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stack 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_attr_getstacksize 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_attr_setstacksize 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_ATTR_STACKADDR (== -1) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can allocate and control a thread's 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stack. If not supported, the following functions 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will return ENOSYS, indicating they are not 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * supported: 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_attr_getstackaddr 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_attr_setstackaddr 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can use realtime scheduling. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This option indicates that the behaviour of some 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implemented functions conforms to the additional TPS 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * requirements in the standard. E.g. rwlocks favour 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * writers over readers when threads have equal priority. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_PRIO_INHERIT (== -1) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can create priority inheritance 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * mutexes. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_getprotocol + 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_setprotocol + 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_PRIO_PROTECT (== -1) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can create priority ceiling mutexes 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates the availability of: 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutex_getprioceiling 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutex_setprioceiling 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_getprioceiling 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_getprotocol + 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_setprioceiling 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_setprotocol + 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_PROCESS_SHARED (== -1) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If set, you can create mutexes and condition 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * variables that can be shared with another 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * process.If set, indicates the availability 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of: 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_getpshared 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_setpshared 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_condattr_getpshared 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_condattr_setpshared 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L you can use the special *_r library 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions that provide thread-safe behaviour 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_READER_WRITER_LOCKS (== 200112L) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can use read/write locks 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_SPIN_LOCKS (== 200112L) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can use spin locks 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * _POSIX_BARRIERS (== 200112L) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If == 200112L, you can use barriers 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * + These functions provide both 'inherit' and/or 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 'protect' protocol, based upon these macro 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * settings. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------------- 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX Options 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREADS 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREADS 200809L 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_READER_WRITER_LOCKS 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_READER_WRITER_LOCKS 200809L 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_SPIN_LOCKS 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_SPIN_LOCKS 200809L 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_BARRIERS 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_BARRIERS 200809L 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_SAFE_FUNCTIONS 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_ATTR_STACKSIZE 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_ATTR_STACKSIZE 200809L 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The following options are not supported 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_ATTR_STACKADDR 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_ATTR_STACKADDR -1 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_PRIO_INHERIT 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_PRIO_INHERIT -1 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_PRIO_PROTECT 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_PRIO_PROTECT -1 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* TPS is not fully supported. */ 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_PRIORITY_SCHEDULING 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_PROCESS_SHARED 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_PROCESS_SHARED -1 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX 1003.1-2001 Limits 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * =========================== 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * These limits are normally set in <limits.h>, which is not provided with 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthreads-win32. 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PTHREAD_DESTRUCTOR_ITERATIONS 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Maximum number of attempts to destroy 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a thread's thread-specific data on 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * termination (must be at least 4) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PTHREAD_KEYS_MAX 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Maximum number of thread-specific data keys 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * available per process (must be at least 128) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PTHREAD_STACK_MIN 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Minimum supported stack size for a thread 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PTHREAD_THREADS_MAX 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Maximum number of threads supported per 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * process (must be at least 64). 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SEM_NSEMS_MAX 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The maximum number of semaphores a process can have. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (must be at least 256) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SEM_VALUE_MAX 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The maximum value a semaphore can have. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (must be at least 32767) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTHREAD_DESTRUCTOR_ITERATIONS 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_KEYS_MAX 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_KEYS_MAX 128 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTHREAD_KEYS_MAX 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTHREAD_STACK_MIN 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_STACK_MIN 0 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_THREAD_THREADS_MAX 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_THREAD_THREADS_MAX 64 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Arbitrary value */ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTHREAD_THREADS_MAX 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_THREADS_MAX 2019 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_SEM_NSEMS_MAX 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_SEM_NSEMS_MAX 256 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Arbitrary value */ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SEM_NSEMS_MAX 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SEM_NSEMS_MAX 1024 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef _POSIX_SEM_VALUE_MAX 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _POSIX_SEM_VALUE_MAX 32767 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SEM_VALUE_MAX 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SEM_VALUE_MAX INT_MAX 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__) && !defined(__declspec) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# error Please upgrade your GNU compiler to one that supports __declspec. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When building the library, you should define PTW32_BUILD so that 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the variables/functions are exported correctly. When using the library, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * do NOT define PTW32_BUILD, and then the variables/functions will 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be imported correctly. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_STATIC_LIB) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(PTW32_BUILD) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PTW32_DLLPORT __declspec (dllexport) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PTW32_DLLPORT __declspec (dllimport) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PTW32_DLLPORT 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Open Watcom C/C++ compiler uses a non-standard calling convention 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that passes function args in registers unless __cdecl is explicitly specified 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in exposed function prototypes. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We force all calls to cdecl even though this could slow Watcom code down 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * slightly. If you know that the Watcom compiler will be used to build both 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the DLL and application, then you can probably define this as a null string. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remember that pthread.h (this file) is used for both the DLL and application builds. 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_CDECL __cdecl 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <sys/types.h> 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic handle type - intended to extend uniqueness beyond 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that available with a simple pointer. It should scale for either 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IA-32 or IA-64. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * p; /* Pointer to actual object */ 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int x; /* Extra information - reuse count etc */ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} ptw32_handle_t; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ptw32_handle_t pthread_t; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_attr_t_ * pthread_attr_t; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_once_t_ pthread_once_t; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_key_t_ * pthread_key_t; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_mutex_t_ * pthread_mutex_t; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_cond_t_ * pthread_cond_t; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_condattr_t_ * pthread_condattr_t; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_rwlock_t_ * pthread_rwlock_t; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_spinlock_t_ * pthread_spinlock_t; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_barrier_t_ * pthread_barrier_t; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX Threads 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_attr_{get,set}detachstate 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_CREATE_JOINABLE = 0, /* Default */ 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_CREATE_DETACHED = 1, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_attr_{get,set}inheritsched 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_INHERIT_SCHED = 0, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_EXPLICIT_SCHED = 1, /* Default */ 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_{get,set}scope 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_SCOPE_PROCESS = 0, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_SCOPE_SYSTEM = 1, /* Default */ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_setcancelstate paramters 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_CANCEL_ENABLE = 0, /* Default */ 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_CANCEL_DISABLE = 1, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_setcanceltype parameters 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_CANCEL_ASYNCHRONOUS = 0, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_CANCEL_DEFERRED = 1, /* Default */ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_{get,set}pshared 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_condattr_{get,set}pshared 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_PROCESS_PRIVATE = 0, 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_PROCESS_SHARED = 1, 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_mutexattr_{get,set}robust 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_STALLED = 0, /* Default */ 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_ROBUST = 1, 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_barrier_wait 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_BARRIER_SERIAL_THREAD = -1 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cancelation 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_CANCELED ((void *)(size_t) -1) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Once Key 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct pthread_once_t_ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int done; /* indicates if user function has been executed */ 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * lock; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int reserved1; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int reserved2; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Object initialisers 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ==================== 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compatibility with LinuxThreads 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mutex types. 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Compatibility with LinuxThreads */ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_FAST_NP, 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_RECURSIVE_NP, 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_ERRORCHECK_NP, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* For compatibility with POSIX */ 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct ptw32_cleanup_t ptw32_cleanup_t; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Disable MSVC 'anachronism used' warning */ 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning( disable : 4229 ) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning( default : 4229 ) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ptw32_cleanup_t 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_cleanup_callback_t routine; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *arg; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ptw32_cleanup_t *prev; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CLEANUP_SEH) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WIN32 SEH version of cancel cleanup. 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define pthread_cleanup_push( _rout, _arg ) \ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_cleanup_t _cleanup; \ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _cleanup.arg = (_arg); \ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __try \ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define pthread_cleanup_pop( _execute ) \ 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __finally \ 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( _execute || AbnormalTermination()) \ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(_cleanup.routine))( _cleanup.arg ); \ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* __CLEANUP_SEH */ 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CLEANUP_C) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C implementation of PThreads cancel cleanup 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define pthread_cleanup_push( _rout, _arg ) \ 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_cleanup_t _cleanup; \ 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define pthread_cleanup_pop( _execute ) \ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) ptw32_pop_cleanup( _execute ); \ 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* __CLEANUP_C */ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CLEANUP_CXX) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C++ version of cancel cleanup. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - John E. Bossom. 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class PThreadCleanup { 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PThreadCleanup 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Purpose 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This class is a C++ helper class that is 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * used to implement pthread_cleanup_push/ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_cleanup_pop. 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The destructor of this class automatically 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pops the pushed cleanup routine regardless 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of how the code exits the scope 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (i.e. such as by an exception) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_cleanup_callback_t cleanUpRout; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * obj; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int executeIt; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PThreadCleanup() : 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cleanUpRout( 0 ), 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj( 0 ), 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) executeIt( 0 ) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No cleanup performed 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PThreadCleanup( 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_cleanup_callback_t routine, 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * arg ) : 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cleanUpRout( routine ), 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj( arg ), 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) executeIt( 1 ) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers a cleanup routine for 'arg' 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PThreadCleanup() 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) (*cleanUpRout)( obj ); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void execute( int exec ) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) executeIt = exec; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C++ implementation of PThreads cancel cleanup; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This implementation takes advantage of a helper 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * class who's destructor automatically calls the 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cleanup routine if we exit our scope weirdly 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define pthread_cleanup_push( _rout, _arg ) \ 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) (_arg) ); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define pthread_cleanup_pop( _execute ) \ 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cleanup.execute( _execute ); \ 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __CLEANUP_CXX */ 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __CLEANUP_C */ 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __CLEANUP_SEH */ 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * =============== 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * =============== 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Methods 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * =============== 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * =============== 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PThread Attribute Functions 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *detachstate); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void **stackaddr); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t * stacksize); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int detachstate); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *stackaddr); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t stacksize); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct sched_param *param); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct sched_param *param); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (const pthread_attr_t *, 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int inheritsched); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t * attr, 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int * inheritsched); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PThread Functions 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pthread_attr_t * attr, 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *(PTW32_CDECL *start) (void *), 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *arg); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pthread_t t2); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void **value_ptr); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *oldstate); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *oldtype); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (PTW32_CDECL *init_routine) (void)); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_LEVEL >= PTW32_LEVEL_MAX 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_cleanup_callback_t routine, 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *arg); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Thread Specific Data Functions 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (PTW32_CDECL *destructor) (void *)); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *value); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mutex Attribute Functions 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attr, 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pshared); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pshared); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *kind); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setrobust( 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pthread_mutexattr_t *attr, 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int robust); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getrobust( 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pthread_mutexattr_t * attr, 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int * robust); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Barrier Attribute Functions 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attr, 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pshared); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pshared); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mutex Functions 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pthread_mutexattr_t * attr); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t * mutex, 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct timespec *abstime); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutex_consistent (pthread_mutex_t * mutex); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Spinlock Functions 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Barrier Functions 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pthread_barrierattr_t * attr, 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int count); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Condition Variable Attribute Functions 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pshared); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pshared); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Condition Variable Functions 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pthread_condattr_t * attr); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pthread_mutex_t * mutex); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pthread_mutex_t * mutex, 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct timespec *abstime); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Scheduling 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int policy, 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct sched_param *param); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *policy, 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct sched_param *param); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read-Write Lock Functions 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pthread_rwlockattr_t *attr); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct timespec *abstime); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct timespec *abstime); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pshared); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pshared); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Signal Functions. Should be defined in <signal.h> but MSVC and MinGW32 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * already have signal.h that don't define these. 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Non-portable functions 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compatibility with Linux. 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int kind); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *kind); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Possibly supported by other POSIX threads implementations 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT unsigned __int64 PTW32_CDECL pthread_getunique_np(pthread_t thread); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Useful if an application wants to statically link 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the lib rather than load the DLL at run-time. 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Features that are auto-detected at load/run time. 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ptw32_features { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a system time change with the library. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Causes the library to perform various functions 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in response to the change. Should be called whenever 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the application's top level window receives a 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WM_TIMECHANGE message. It can be passed directly to 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_create() as a new thread if desired. 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_LEVEL >= PTW32_LEVEL_MAX 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the Win32 HANDLE for the POSIX thread. 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the win32 thread ID for POSIX thread. 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT DWORD PTW32_CDECL pthread_getw32threadid_np (pthread_t thread); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Protected Methods 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function blocks until the given WIN32 handle 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is signaled or pthread_cancel had been called. 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function allows the caller to hook into the 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PThreads cancel mechanism. It is implemented using 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WaitForMultipleObjects 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * on 'waitHandle' and a manually reset WIN32 Event 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * used to implement pthread_cancel. The 'timeout' 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * argument to TimedWait is simply passed to 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WaitForMultipleObjects. 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD timeout); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Thread-Safe C Runtime Library Mappings. 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_UWIN) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(NEED_ERRNO) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PTW32_DLLPORT int * PTW32_CDECL _errno( void ); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if !defined(errno) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if (defined(_MT) || defined(_DLL)) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __declspec(dllimport) extern int * __cdecl _errno(void); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define errno (*_errno()) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some compiler environments don't define some things. 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__BORLANDC__) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define _ftime ftime 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define _timeb timeb 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal exceptions 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ptw32_exception {}; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ptw32_exception_cancel : public ptw32_exception {}; 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ptw32_exception_exit : public ptw32_exception {}; 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_LEVEL >= PTW32_LEVEL_MAX 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* FIXME: This is only required if the library was built using SEH */ 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get internal SEH tag 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_BUILD) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CLEANUP_SEH) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redefine the SEH __except keyword to ensure that applications 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * propagate our internal exceptions up to the library's internal handlers. 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __except( E ) \ 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __CLEANUP_SEH */ 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CLEANUP_CXX) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redefine the C++ catch keyword to ensure that applications 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * propagate our internal exceptions up to the library's internal handlers. 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if you want Pthread-Win32 cancelation and pthread_exit to work. 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PtW32NoCatchWarn) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message("------------------------------------------------------------------") 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message("When compiling applications with MSVC++ and C++ exception handling:") 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" cancelation and pthread_exit to work. For example:") 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message("") 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" #if defined(PtW32CatchAll)") 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" PtW32CatchAll") 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" #else") 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" catch(...)") 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" #endif") 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" {") 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" /* Catchall block processing */") 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message(" }") 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma message("------------------------------------------------------------------") 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PtW32CatchAll \ 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catch( ptw32_exception & ) { throw; } \ 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catch( ... ) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* _MSC_VER */ 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define catch( E ) \ 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catch( ptw32_exception & ) { throw; } \ 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catch( E ) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _MSC_VER */ 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __CLEANUP_CXX */ 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* ! PTW32_BUILD */ 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} /* End of extern "C" */ 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __cplusplus */ 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PTW32__HANDLE_DEF) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef HANDLE 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PTW32__DWORD_DEF) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef DWORD 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_LEVEL 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_LEVEL_MAX 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* ! RC_INVOKED */ 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTHREAD_H */ 1369