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