From 697e1d49416e9765b9aebc539d5f1ad4441dc46d Mon Sep 17 00:00:00 2001 From: raysan5 Date: Mon, 18 Jul 2016 14:53:11 +0200 Subject: [PATCH] Update pthreads library (win32) This library is only required by physac module to compulte physics in a second thread --- src/external/pthread/COPYING | 150 +++ src/external/pthread/include/pthread.h | 1368 ++++++++++++++++++++++ src/external/pthread/include/sched.h | 183 +++ src/external/pthread/include/semaphore.h | 169 +++ src/external/pthread/lib/libpthreadGC2.a | Bin 0 -> 93480 bytes src/external/pthread/pthreadGC2.dll | Bin 119888 -> 0 bytes 6 files changed, 1870 insertions(+) create mode 100644 src/external/pthread/COPYING create mode 100644 src/external/pthread/include/pthread.h create mode 100644 src/external/pthread/include/sched.h create mode 100644 src/external/pthread/include/semaphore.h create mode 100644 src/external/pthread/lib/libpthreadGC2.a delete mode 100644 src/external/pthread/pthreadGC2.dll diff --git a/src/external/pthread/COPYING b/src/external/pthread/COPYING new file mode 100644 index 00000000..5cfea0d0 --- /dev/null +++ b/src/external/pthread/COPYING @@ -0,0 +1,150 @@ + pthreads-win32 - a POSIX threads library for Microsoft Windows + + +This file is Copyrighted +------------------------ + + This file is covered under the following Copyright: + + Copyright (C) 2001,2006 Ross P. Johnson + All rights reserved. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Pthreads-win32 is covered by the GNU Lesser General Public License +------------------------------------------------------------------ + + Pthreads-win32 is open software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation version 2.1 of the + License. + + Pthreads-win32 is several binary link libraries, several modules, + associated interface definition files and scripts used to control + its compilation and installation. + + Pthreads-win32 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + A copy of the GNU Lesser General Public License is distributed with + pthreads-win32 under the filename: + + COPYING.LIB + + You should have received a copy of the version 2.1 GNU Lesser General + Public License with pthreads-win32; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place + Suite 330 + Boston, MA 02111-1307 + USA + + The contact addresses for pthreads-win32 is as follows: + + Web: http://sources.redhat.com/pthreads-win32 + Email: Ross Johnson + Please use: Firstname.Lastname@homemail.com.au + + + +Pthreads-win32 copyrights and exception files +--------------------------------------------- + + With the exception of the files listed below, Pthreads-win32 + is covered under the following GNU Lesser General Public License + Copyrights: + + Pthreads-win32 - POSIX Threads Library for Win32 + Copyright(C) 1998 John E. Bossom + Copyright(C) 1999,2006 Pthreads-win32 contributors + + The current list of contributors is contained + in the file CONTRIBUTORS included with the source + code distribution. The current list of CONTRIBUTORS + can also be seen at the following WWW location: + http://sources.redhat.com/pthreads-win32/contributors.html + + Contact Email: Ross Johnson + Please use: Firstname.Lastname@homemail.com.au + + These files are not covered under one of the Copyrights listed above: + + COPYING + COPYING.LIB + tests/rwlock7.c + + This file, COPYING, is distributed under the Copyright found at the + top of this file. It is important to note that you may distribute + verbatim copies of this file but you may not modify this file. + + The file COPYING.LIB, which contains a copy of the version 2.1 + GNU Lesser General Public License, is itself copyrighted by the + Free Software Foundation, Inc. Please note that the Free Software + Foundation, Inc. does NOT have a copyright over Pthreads-win32, + only the COPYING.LIB that is supplied with pthreads-win32. + + The file tests/rwlock7.c is derived from code written by + Dave Butenhof for his book 'Programming With POSIX(R) Threads'. + The original code was obtained by free download from his website + http://home.earthlink.net/~anneart/family/Threads/source.html + and did not contain a copyright or author notice. It is assumed to + be freely distributable. + + In all cases one may use and distribute these exception files freely. + And because one may freely distribute the LGPL covered files, the + entire pthreads-win32 source may be freely used and distributed. + + + +General Copyleft and License info +--------------------------------- + + For general information on Copylefts, see: + + http://www.gnu.org/copyleft/ + + For information on GNU Lesser General Public Licenses, see: + + http://www.gnu.org/copyleft/lesser.html + http://www.gnu.org/copyleft/lesser.txt + + +Why pthreads-win32 did not use the GNU General Public License +------------------------------------------------------------- + + The goal of the pthreads-win32 project has been to + provide a quality and complete implementation of the POSIX + threads API for Microsoft Windows within the limits imposed + by virtue of it being a stand-alone library and not + linked directly to other POSIX compliant libraries. For + example, some functions and features, such as those based + on POSIX signals, are missing. + + Pthreads-win32 is a library, available in several different + versions depending on supported compilers, and may be used + as a dynamically linked module or a statically linked set of + binary modules. It is not an application on it's own. + + It was fully intended that pthreads-win32 be usable with + commercial software not covered by either the GPL or the LGPL + licenses. Pthreads-win32 has many contributors to it's + code base, many of whom have done so because they have + used the library in commercial or proprietry software + projects. + + Releasing pthreads-win32 under the LGPL ensures that the + library can be used widely, while at the same time ensures + that bug fixes and improvements to the pthreads-win32 code + itself is returned to benefit all current and future users + of the library. + + Although pthreads-win32 makes it possible for applications + that use POSIX threads to be ported to Win32 platforms, the + broader goal of the project is to encourage the use of open + standards, and in particular, to make it just a little easier + for developers writing Win32 applications to consider + widening the potential market for their products. diff --git a/src/external/pthread/include/pthread.h b/src/external/pthread/include/pthread.h new file mode 100644 index 00000000..b4072f72 --- /dev/null +++ b/src/external/pthread/include/pthread.h @@ -0,0 +1,1368 @@ +/* This is an implementation of the threads API of POSIX 1003.1-2001. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#if !defined( PTHREAD_H ) +#define PTHREAD_H + +/* + * See the README file for an explanation of the pthreads-win32 version + * numbering scheme and how the DLL is named etc. + */ +#define PTW32_VERSION 2,9,1,0 +#define PTW32_VERSION_STRING "2, 9, 1, 0\0" + +/* There are three implementations of cancel cleanup. + * Note that pthread.h is included in both application + * compilation units and also internally for the library. + * The code here and within the library aims to work + * for all reasonable combinations of environments. + * + * The three implementations are: + * + * WIN32 SEH + * C + * C++ + * + * Please note that exiting a push/pop block via + * "return", "exit", "break", or "continue" will + * lead to different behaviour amongst applications + * depending upon whether the library was built + * using SEH, C++, or C. For example, a library built + * with SEH will call the cleanup routine, while both + * C++ and C built versions will not. + */ + +/* + * Define defaults for cleanup code. + * Note: Unless the build explicitly defines one of the following, then + * we default to standard C style cleanup. This style uses setjmp/longjmp + * in the cancelation and thread exit implementations and therefore won't + * do stack unwinding if linked to applications that have it (e.g. + * C++ apps). This is currently consistent with most/all commercial Unix + * POSIX threads implementations. + */ +#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) +# define __CLEANUP_C +#endif + +#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC)) +#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. +#endif + +/* + * Stop here if we are being included by the resource compiler. + */ +#if !defined(RC_INVOKED) + +#undef PTW32_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_LEVEL +#define PTW32_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_LEVEL +#define PTW32_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_LEVEL_MAX 3 + +#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_LEVEL) +#define PTW32_LEVEL PTW32_LEVEL_MAX +/* Include everything */ +#endif + +#if defined(_UWIN) +# define HAVE_STRUCT_TIMESPEC 1 +# define HAVE_SIGNAL_H 1 +# undef HAVE_PTW32_CONFIG_H +# pragma comment(lib, "pthread") +#endif + +/* + * ------------------------------------------------------------- + * + * + * Module: pthread.h + * + * Purpose: + * Provides an implementation of PThreads based upon the + * standard: + * + * POSIX 1003.1-2001 + * and + * The Single Unix Specification version 3 + * + * (these two are equivalent) + * + * in order to enhance code portability between Windows, + * various commercial Unix implementations, and Linux. + * + * See the ANNOUNCE file for a full list of conforming + * routines and defined constants, and a list of missing + * routines and constants not defined in this implementation. + * + * Authors: + * There have been many contributors to this library. + * The initial implementation was contributed by + * John Bossom, and several others have provided major + * sections or revisions of parts of the implementation. + * Often significant effort has been contributed to + * find and fix important bugs and other problems to + * improve the reliability of the library, which sometimes + * is not reflected in the amount of code which changed as + * result. + * As much as possible, the contributors are acknowledged + * in the ChangeLog file in the source code distribution + * where their changes are noted in detail. + * + * Contributors are listed in the CONTRIBUTORS file. + * + * As usual, all bouquets go to the contributors, and all + * brickbats go to the project maintainer. + * + * Maintainer: + * The code base for this project is coordinated and + * eventually pre-tested, packaged, and made available by + * + * Ross Johnson + * + * QA Testers: + * Ultimately, the library is tested in the real world by + * a host of competent and demanding scientists and + * engineers who report bugs and/or provide solutions + * which are then fixed or incorporated into subsequent + * versions of the library. Each time a bug is fixed, a + * test case is written to prove the fix and ensure + * that later changes to the code don't reintroduce the + * same error. The number of test cases is slowly growing + * and therefore so is the code reliability. + * + * Compliance: + * See the file ANNOUNCE for the list of implemented + * and not-implemented routines and defined options. + * Of course, these are all defined is this file as well. + * + * Web site: + * The source code and other information about this library + * are available from + * + * http://sources.redhat.com/pthreads-win32/ + * + * ------------------------------------------------------------- + */ + +/* Try to avoid including windows.h */ +#if (defined(__MINGW64__) || defined(__MINGW32__)) && defined(__cplusplus) +#define PTW32_INCLUDE_WINDOWS_H +#endif + +#if defined(PTW32_INCLUDE_WINDOWS_H) +#include +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) +/* + * VC++6.0 or early compiler's header has no DWORD_PTR type. + */ +typedef unsigned long DWORD_PTR; +typedef unsigned long ULONG_PTR; +#endif +/* + * ----------------- + * autoconf switches + * ----------------- + */ + +#if defined(HAVE_PTW32_CONFIG_H) +#include "config.h" +#endif /* HAVE_PTW32_CONFIG_H */ + +#if !defined(NEED_FTIME) +#include +#else /* NEED_FTIME */ +/* use native WIN32 time API */ +#endif /* NEED_FTIME */ + +#if defined(HAVE_SIGNAL_H) +#include +#endif /* HAVE_SIGNAL_H */ + +#include + +/* + * Boolean values to make us independent of system includes. + */ +enum { + PTW32_FALSE = 0, + PTW32_TRUE = (! PTW32_FALSE) +}; + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#if !defined(PTW32_CONFIG_H) +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(__MINGW64__) +# define HAVE_STRUCT_TIMESPEC +# define HAVE_MODE_T +# elif defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +#if defined(NEED_ERRNO) +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Several systems don't define some error numbers. + */ +#if !defined(ENOTSUP) +# define ENOTSUP 48 /* This is the value in Solaris. */ +#endif + +#if !defined(ETIMEDOUT) +# define ETIMEDOUT 10060 /* Same as WSAETIMEDOUT */ +#endif + +#if !defined(ENOSYS) +# define ENOSYS 140 /* Semi-arbitrary value */ +#endif + +#if !defined(EDEADLK) +# if defined(EDEADLOCK) +# define EDEADLK EDEADLOCK +# else +# define EDEADLK 36 /* This is the value in MSVC. */ +# endif +#endif + +/* POSIX 2008 - related to robust mutexes */ +#if !defined(EOWNERDEAD) +# define EOWNERDEAD 43 +#endif +#if !defined(ENOTRECOVERABLE) +# define ENOTRECOVERABLE 44 +#endif + +#include + +/* + * To avoid including windows.h we define only those things that we + * actually need from it. + */ +#if !defined(PTW32_INCLUDE_WINDOWS_H) +#if !defined(HANDLE) +# define PTW32__HANDLE_DEF +# define HANDLE void * +#endif +#if !defined(DWORD) +# define PTW32__DWORD_DEF +# define DWORD unsigned long +#endif +#endif + +#if !defined(HAVE_STRUCT_TIMESPEC) +#define HAVE_STRUCT_TIMESPEC +#if !defined(_TIMESPEC_DEFINED) +#define _TIMESPEC_DEFINED +struct timespec { + time_t tv_sec; + long tv_nsec; +}; +#endif /* _TIMESPEC_DEFINED */ +#endif /* HAVE_STRUCT_TIMESPEC */ + +#if !defined(SIG_BLOCK) +#define SIG_BLOCK 0 +#endif /* SIG_BLOCK */ + +#if !defined(SIG_UNBLOCK) +#define SIG_UNBLOCK 1 +#endif /* SIG_UNBLOCK */ + +#if !defined(SIG_SETMASK) +#define SIG_SETMASK 2 +#endif /* SIG_SETMASK */ + +#if defined(__cplusplus) +extern "C" +{ +#endif /* __cplusplus */ + +/* + * ------------------------------------------------------------- + * + * POSIX 1003.1-2001 Options + * ========================= + * + * Options are normally set in , which is not provided + * with pthreads-win32. + * + * For conformance with the Single Unix Specification (version 3), all of the + * options below are defined, and have a value of either -1 (not supported) + * or 200112L (supported). + * + * These options can neither be left undefined nor have a value of 0, because + * either indicates that sysconf(), which is not implemented, may be used at + * runtime to check the status of the option. + * + * _POSIX_THREADS (== 200112L) + * If == 200112L, you can use threads + * + * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) + * If == 200112L, you can control the size of a thread's + * stack + * pthread_attr_getstacksize + * pthread_attr_setstacksize + * + * _POSIX_THREAD_ATTR_STACKADDR (== -1) + * If == 200112L, you can allocate and control a thread's + * stack. If not supported, the following functions + * will return ENOSYS, indicating they are not + * supported: + * pthread_attr_getstackaddr + * pthread_attr_setstackaddr + * + * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) + * If == 200112L, you can use realtime scheduling. + * This option indicates that the behaviour of some + * implemented functions conforms to the additional TPS + * requirements in the standard. E.g. rwlocks favour + * writers over readers when threads have equal priority. + * + * _POSIX_THREAD_PRIO_INHERIT (== -1) + * If == 200112L, you can create priority inheritance + * mutexes. + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PRIO_PROTECT (== -1) + * If == 200112L, you can create priority ceiling mutexes + * Indicates the availability of: + * pthread_mutex_getprioceiling + * pthread_mutex_setprioceiling + * pthread_mutexattr_getprioceiling + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprioceiling + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PROCESS_SHARED (== -1) + * If set, you can create mutexes and condition + * variables that can be shared with another + * process.If set, indicates the availability + * of: + * pthread_mutexattr_getpshared + * pthread_mutexattr_setpshared + * pthread_condattr_getpshared + * pthread_condattr_setpshared + * + * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) + * If == 200112L you can use the special *_r library + * functions that provide thread-safe behaviour + * + * _POSIX_READER_WRITER_LOCKS (== 200112L) + * If == 200112L, you can use read/write locks + * + * _POSIX_SPIN_LOCKS (== 200112L) + * If == 200112L, you can use spin locks + * + * _POSIX_BARRIERS (== 200112L) + * If == 200112L, you can use barriers + * + * + These functions provide both 'inherit' and/or + * 'protect' protocol, based upon these macro + * settings. + * + * ------------------------------------------------------------- + */ + +/* + * POSIX Options + */ +#undef _POSIX_THREADS +#define _POSIX_THREADS 200809L + +#undef _POSIX_READER_WRITER_LOCKS +#define _POSIX_READER_WRITER_LOCKS 200809L + +#undef _POSIX_SPIN_LOCKS +#define _POSIX_SPIN_LOCKS 200809L + +#undef _POSIX_BARRIERS +#define _POSIX_BARRIERS 200809L + +#undef _POSIX_THREAD_SAFE_FUNCTIONS +#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L + +#undef _POSIX_THREAD_ATTR_STACKSIZE +#define _POSIX_THREAD_ATTR_STACKSIZE 200809L + +/* + * The following options are not supported + */ +#undef _POSIX_THREAD_ATTR_STACKADDR +#define _POSIX_THREAD_ATTR_STACKADDR -1 + +#undef _POSIX_THREAD_PRIO_INHERIT +#define _POSIX_THREAD_PRIO_INHERIT -1 + +#undef _POSIX_THREAD_PRIO_PROTECT +#define _POSIX_THREAD_PRIO_PROTECT -1 + +/* TPS is not fully supported. */ +#undef _POSIX_THREAD_PRIORITY_SCHEDULING +#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 + +#undef _POSIX_THREAD_PROCESS_SHARED +#define _POSIX_THREAD_PROCESS_SHARED -1 + + +/* + * POSIX 1003.1-2001 Limits + * =========================== + * + * These limits are normally set in , which is not provided with + * pthreads-win32. + * + * PTHREAD_DESTRUCTOR_ITERATIONS + * Maximum number of attempts to destroy + * a thread's thread-specific data on + * termination (must be at least 4) + * + * PTHREAD_KEYS_MAX + * Maximum number of thread-specific data keys + * available per process (must be at least 128) + * + * PTHREAD_STACK_MIN + * Minimum supported stack size for a thread + * + * PTHREAD_THREADS_MAX + * Maximum number of threads supported per + * process (must be at least 64). + * + * SEM_NSEMS_MAX + * The maximum number of semaphores a process can have. + * (must be at least 256) + * + * SEM_VALUE_MAX + * The maximum value a semaphore can have. + * (must be at least 32767) + * + */ +#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS +#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 + +#undef PTHREAD_DESTRUCTOR_ITERATIONS +#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS + +#undef _POSIX_THREAD_KEYS_MAX +#define _POSIX_THREAD_KEYS_MAX 128 + +#undef PTHREAD_KEYS_MAX +#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX + +#undef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 0 + +#undef _POSIX_THREAD_THREADS_MAX +#define _POSIX_THREAD_THREADS_MAX 64 + + /* Arbitrary value */ +#undef PTHREAD_THREADS_MAX +#define PTHREAD_THREADS_MAX 2019 + +#undef _POSIX_SEM_NSEMS_MAX +#define _POSIX_SEM_NSEMS_MAX 256 + + /* Arbitrary value */ +#undef SEM_NSEMS_MAX +#define SEM_NSEMS_MAX 1024 + +#undef _POSIX_SEM_VALUE_MAX +#define _POSIX_SEM_VALUE_MAX 32767 + +#undef SEM_VALUE_MAX +#define SEM_VALUE_MAX INT_MAX + + +#if defined(__GNUC__) && !defined(__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the library, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the library, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#if !defined(PTW32_STATIC_LIB) +# if defined(PTW32_BUILD) +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * The Open Watcom C/C++ compiler uses a non-standard calling convention + * that passes function args in registers unless __cdecl is explicitly specified + * in exposed function prototypes. + * + * We force all calls to cdecl even though this could slow Watcom code down + * slightly. If you know that the Watcom compiler will be used to build both + * the DLL and application, then you can probably define this as a null string. + * Remember that pthread.h (this file) is used for both the DLL and application builds. + */ +#define PTW32_CDECL __cdecl + +#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX +# include +#else +/* + * Generic handle type - intended to extend uniqueness beyond + * that available with a simple pointer. It should scale for either + * IA-32 or IA-64. + */ +typedef struct { + void * p; /* Pointer to actual object */ + unsigned int x; /* Extra information - reuse count etc */ +} ptw32_handle_t; + +typedef ptw32_handle_t pthread_t; +typedef struct pthread_attr_t_ * pthread_attr_t; +typedef struct pthread_once_t_ pthread_once_t; +typedef struct pthread_key_t_ * pthread_key_t; +typedef struct pthread_mutex_t_ * pthread_mutex_t; +typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; +typedef struct pthread_cond_t_ * pthread_cond_t; +typedef struct pthread_condattr_t_ * pthread_condattr_t; +#endif +typedef struct pthread_rwlock_t_ * pthread_rwlock_t; +typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; +typedef struct pthread_spinlock_t_ * pthread_spinlock_t; +typedef struct pthread_barrier_t_ * pthread_barrier_t; +typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; + +/* + * ==================== + * ==================== + * POSIX Threads + * ==================== + * ==================== + */ + +enum { +/* + * pthread_attr_{get,set}detachstate + */ + PTHREAD_CREATE_JOINABLE = 0, /* Default */ + PTHREAD_CREATE_DETACHED = 1, + +/* + * pthread_attr_{get,set}inheritsched + */ + PTHREAD_INHERIT_SCHED = 0, + PTHREAD_EXPLICIT_SCHED = 1, /* Default */ + +/* + * pthread_{get,set}scope + */ + PTHREAD_SCOPE_PROCESS = 0, + PTHREAD_SCOPE_SYSTEM = 1, /* Default */ + +/* + * pthread_setcancelstate paramters + */ + PTHREAD_CANCEL_ENABLE = 0, /* Default */ + PTHREAD_CANCEL_DISABLE = 1, + +/* + * pthread_setcanceltype parameters + */ + PTHREAD_CANCEL_ASYNCHRONOUS = 0, + PTHREAD_CANCEL_DEFERRED = 1, /* Default */ + +/* + * pthread_mutexattr_{get,set}pshared + * pthread_condattr_{get,set}pshared + */ + PTHREAD_PROCESS_PRIVATE = 0, + PTHREAD_PROCESS_SHARED = 1, + +/* + * pthread_mutexattr_{get,set}robust + */ + PTHREAD_MUTEX_STALLED = 0, /* Default */ + PTHREAD_MUTEX_ROBUST = 1, + +/* + * pthread_barrier_wait + */ + PTHREAD_BARRIER_SERIAL_THREAD = -1 +}; + +/* + * ==================== + * ==================== + * Cancelation + * ==================== + * ==================== + */ +#define PTHREAD_CANCELED ((void *)(size_t) -1) + + +/* + * ==================== + * ==================== + * Once Key + * ==================== + * ==================== + */ +#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} + +struct pthread_once_t_ +{ + int done; /* indicates if user function has been executed */ + void * lock; + int reserved1; + int reserved2; +}; + + +/* + * ==================== + * ==================== + * Object initialisers + * ==================== + * ==================== + */ +#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) + +/* + * Compatibility with LinuxThreads + */ +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER + +#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) + +#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) + +#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) + + +/* + * Mutex types. + */ +enum +{ + /* Compatibility with LinuxThreads */ + PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, + /* For compatibility with POSIX */ + PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL +}; + + +typedef struct ptw32_cleanup_t ptw32_cleanup_t; + +#if defined(_MSC_VER) +/* Disable MSVC 'anachronism used' warning */ +#pragma warning( disable : 4229 ) +#endif + +typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); + +#if defined(_MSC_VER) +#pragma warning( default : 4229 ) +#endif + +struct ptw32_cleanup_t +{ + ptw32_cleanup_callback_t routine; + void *arg; + struct ptw32_cleanup_t *prev; +}; + +#if defined(__CLEANUP_SEH) + /* + * WIN32 SEH version of cancel cleanup. + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ + _cleanup.arg = (_arg); \ + __try \ + { \ + +#define pthread_cleanup_pop( _execute ) \ + } \ + __finally \ + { \ + if( _execute || AbnormalTermination()) \ + { \ + (*(_cleanup.routine))( _cleanup.arg ); \ + } \ + } \ + } + +#else /* __CLEANUP_SEH */ + +#if defined(__CLEANUP_C) + + /* + * C implementation of PThreads cancel cleanup + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ + +#define pthread_cleanup_pop( _execute ) \ + (void) ptw32_pop_cleanup( _execute ); \ + } + +#else /* __CLEANUP_C */ + +#if defined(__CLEANUP_CXX) + + /* + * C++ version of cancel cleanup. + * - John E. Bossom. + */ + + class PThreadCleanup { + /* + * PThreadCleanup + * + * Purpose + * This class is a C++ helper class that is + * used to implement pthread_cleanup_push/ + * pthread_cleanup_pop. + * The destructor of this class automatically + * pops the pushed cleanup routine regardless + * of how the code exits the scope + * (i.e. such as by an exception) + */ + ptw32_cleanup_callback_t cleanUpRout; + void * obj; + int executeIt; + + public: + PThreadCleanup() : + cleanUpRout( 0 ), + obj( 0 ), + executeIt( 0 ) + /* + * No cleanup performed + */ + { + } + + PThreadCleanup( + ptw32_cleanup_callback_t routine, + void * arg ) : + cleanUpRout( routine ), + obj( arg ), + executeIt( 1 ) + /* + * Registers a cleanup routine for 'arg' + */ + { + } + + ~PThreadCleanup() + { + if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) + { + (void) (*cleanUpRout)( obj ); + } + } + + void execute( int exec ) + { + executeIt = exec; + } + }; + + /* + * C++ implementation of PThreads cancel cleanup; + * This implementation takes advantage of a helper + * class who's destructor automatically calls the + * cleanup routine if we exit our scope weirdly + */ +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ + (void *) (_arg) ); + +#define pthread_cleanup_pop( _execute ) \ + cleanup.execute( _execute ); \ + } + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __CLEANUP_CXX */ + +#endif /* __CLEANUP_C */ + +#endif /* __CLEANUP_SEH */ + +/* + * =============== + * =============== + * Methods + * =============== + * =============== + */ + +/* + * PThread Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, + int *detachstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, + void **stackaddr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, + size_t * stacksize); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, + int detachstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, + void *stackaddr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, + size_t stacksize); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, + int); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (const pthread_attr_t *, + int *); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, + int inheritsched); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t * attr, + int * inheritsched); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, + int); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, + int *); + +/* + * PThread Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void *(PTW32_CDECL *start) (void *), + void *arg); + +PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); + +PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, + pthread_t t2); + +PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); + +PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, + void **value_ptr); + +PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); + +PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); + +PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, + int *oldstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, + int *oldtype); + +PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); + +PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, + void (PTW32_CDECL *init_routine) (void)); + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); + +PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, + ptw32_cleanup_callback_t routine, + void *arg); +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Thread Specific Data Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, + void (PTW32_CDECL *destructor) (void *)); + +PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); + +PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, + const void *value); + +PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); + + +/* + * Mutex Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t + * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, + int pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *kind); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setrobust( + pthread_mutexattr_t *attr, + int robust); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getrobust( + const pthread_mutexattr_t * attr, + int * robust); + +/* + * Barrier Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t + * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, + int pshared); + +/* + * Mutex Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, + const pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t * mutex, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_consistent (pthread_mutex_t * mutex); + +/* + * Spinlock Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); + +/* + * Barrier Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, + unsigned int count); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); + +/* + * Condition Variable Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, + int pshared); + +/* + * Condition Variable Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, + const pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); + +/* + * Scheduling + */ +PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, + int policy, + const struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, + int *policy, + struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); + +PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); + +/* + * Read-Write Lock Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, + const pthread_rwlockattr_t *attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, + int pshared); + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 + +/* + * Signal Functions. Should be defined in but MSVC and MinGW32 + * already have signal.h that don't define these. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); + +/* + * Non-portable functions + */ + +/* + * Compatibility with Linux. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, + int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, + int *kind); + +/* + * Possibly supported by other POSIX threads implementations + */ +PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); +PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); +PTW32_DLLPORT unsigned __int64 PTW32_CDECL pthread_getunique_np(pthread_t thread); + +/* + * Useful if an application wants to statically link + * the lib rather than load the DLL at run-time. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); + +/* + * Features that are auto-detected at load/run time. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); +enum ptw32_features { + PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ + PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ +}; + +/* + * Register a system time change with the library. + * Causes the library to perform various functions + * in response to the change. Should be called whenever + * the application's top level window receives a + * WM_TIMECHANGE message. It can be passed directly to + * pthread_create() as a new thread if desired. + */ +PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); + +#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX + +/* + * Returns the Win32 HANDLE for the POSIX thread. + */ +PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); +/* + * Returns the win32 thread ID for POSIX thread. + */ +PTW32_DLLPORT DWORD PTW32_CDECL pthread_getw32threadid_np (pthread_t thread); + + +/* + * Protected Methods + * + * This function blocks until the given WIN32 handle + * is signaled or pthread_cancel had been called. + * This function allows the caller to hook into the + * PThreads cancel mechanism. It is implemented using + * + * WaitForMultipleObjects + * + * on 'waitHandle' and a manually reset WIN32 Event + * used to implement pthread_cancel. The 'timeout' + * argument to TimedWait is simply passed to + * WaitForMultipleObjects. + */ +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, + DWORD timeout); + +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Thread-Safe C Runtime Library Mappings. + */ +#if !defined(_UWIN) +# if defined(NEED_ERRNO) + PTW32_DLLPORT int * PTW32_CDECL _errno( void ); +# else +# if !defined(errno) +# if (defined(_MT) || defined(_DLL)) + __declspec(dllimport) extern int * __cdecl _errno(void); +# define errno (*_errno()) +# endif +# endif +# endif +#endif + +/* + * Some compiler environments don't define some things. + */ +#if defined(__BORLANDC__) +# define _ftime ftime +# define _timeb timeb +#endif + +#if defined(__cplusplus) + +/* + * Internal exceptions + */ +class ptw32_exception {}; +class ptw32_exception_cancel : public ptw32_exception {}; +class ptw32_exception_exit : public ptw32_exception {}; + +#endif + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX + +/* FIXME: This is only required if the library was built using SEH */ +/* + * Get internal SEH tag + */ +PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); + +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +#if !defined(PTW32_BUILD) + +#if defined(__CLEANUP_SEH) + +/* + * Redefine the SEH __except keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#define __except( E ) \ + __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ + ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) + +#endif /* __CLEANUP_SEH */ + +#if defined(__CLEANUP_CXX) + +/* + * Redefine the C++ catch keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#if defined(_MSC_VER) + /* + * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' + * if you want Pthread-Win32 cancelation and pthread_exit to work. + */ + +#if !defined(PtW32NoCatchWarn) + +#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") +#pragma message("------------------------------------------------------------------") +#pragma message("When compiling applications with MSVC++ and C++ exception handling:") +#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") +#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") +#pragma message(" cancelation and pthread_exit to work. For example:") +#pragma message("") +#pragma message(" #if defined(PtW32CatchAll)") +#pragma message(" PtW32CatchAll") +#pragma message(" #else") +#pragma message(" catch(...)") +#pragma message(" #endif") +#pragma message(" {") +#pragma message(" /* Catchall block processing */") +#pragma message(" }") +#pragma message("------------------------------------------------------------------") + +#endif + +#define PtW32CatchAll \ + catch( ptw32_exception & ) { throw; } \ + catch( ... ) + +#else /* _MSC_VER */ + +#define catch( E ) \ + catch( ptw32_exception & ) { throw; } \ + catch( E ) + +#endif /* _MSC_VER */ + +#endif /* __CLEANUP_CXX */ + +#endif /* ! PTW32_BUILD */ + +#if defined(__cplusplus) +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#if defined(PTW32__HANDLE_DEF) +# undef HANDLE +#endif +#if defined(PTW32__DWORD_DEF) +# undef DWORD +#endif + +#undef PTW32_LEVEL +#undef PTW32_LEVEL_MAX + +#endif /* ! RC_INVOKED */ + +#endif /* PTHREAD_H */ diff --git a/src/external/pthread/include/sched.h b/src/external/pthread/include/sched.h new file mode 100644 index 00000000..f36a97a6 --- /dev/null +++ b/src/external/pthread/include/sched.h @@ -0,0 +1,183 @@ +/* + * Module: sched.h + * + * Purpose: + * Provides an implementation of POSIX realtime extensions + * as defined in + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#if !defined(_SCHED_H) +#define _SCHED_H + +#undef PTW32_SCHED_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_SCHED_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_SCHED_LEVEL +#define PTW32_SCHED_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_SCHED_LEVEL +#define PTW32_SCHED_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_SCHED_LEVEL_MAX 3 + +#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) +#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX +/* Include everything */ +#endif + + +#if defined(__GNUC__) && !defined(__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the library, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the library, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#if !defined(PTW32_STATIC_LIB) +# if defined(PTW32_BUILD) +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#if !defined(PTW32_CONFIG_H) +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(__MINGW64__) +# define HAVE_STRUCT_TIMESPEC +# define HAVE_MODE_T +# elif defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX +#if defined(NEED_ERRNO) +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ + +#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) +# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX +/* For pid_t */ +# include +/* Required by Unix 98 */ +# include +# else + typedef int pid_t; +# endif +#else + typedef int pid_t; +#endif + +/* Thread scheduling policies */ + +enum { + SCHED_OTHER = 0, + SCHED_FIFO, + SCHED_RR, + SCHED_MIN = SCHED_OTHER, + SCHED_MAX = SCHED_RR +}; + +struct sched_param { + int sched_priority; +}; + +#if defined(__cplusplus) +extern "C" +{ +#endif /* __cplusplus */ + +PTW32_DLLPORT int __cdecl sched_yield (void); + +PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy); + +PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy); + +PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy); + +PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid); + +/* + * Note that this macro returns ENOTSUP rather than + * ENOSYS as might be expected. However, returning ENOSYS + * should mean that sched_get_priority_{min,max} are + * not implemented as well as sched_rr_get_interval. + * This is not the case, since we just don't support + * round-robin scheduling. Therefore I have chosen to + * return the same value as sched_setscheduler when + * SCHED_RR is passed to it. + */ +#define sched_rr_get_interval(_pid, _interval) \ + ( errno = ENOTSUP, (int) -1 ) + + +#if defined(__cplusplus) +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#undef PTW32_SCHED_LEVEL +#undef PTW32_SCHED_LEVEL_MAX + +#endif /* !_SCHED_H */ + diff --git a/src/external/pthread/include/semaphore.h b/src/external/pthread/include/semaphore.h new file mode 100644 index 00000000..c6e9407e --- /dev/null +++ b/src/external/pthread/include/semaphore.h @@ -0,0 +1,169 @@ +/* + * Module: semaphore.h + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#if !defined( SEMAPHORE_H ) +#define SEMAPHORE_H + +#undef PTW32_SEMAPHORE_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_SEMAPHORE_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_SEMAPHORE_LEVEL +#define PTW32_SEMAPHORE_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_SEMAPHORE_LEVEL +#define PTW32_SEMAPHORE_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_SEMAPHORE_LEVEL_MAX 3 + +#if !defined(PTW32_SEMAPHORE_LEVEL) +#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX +/* Include everything */ +#endif + +#if defined(__GNUC__) && ! defined (__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the library, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the library, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#if !defined(PTW32_STATIC_LIB) +# if defined(PTW32_BUILD) +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#if !defined(PTW32_CONFIG_H) +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(__MINGW64__) +# define HAVE_STRUCT_TIMESPEC +# define HAVE_MODE_T +# elif defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX +#if defined(NEED_ERRNO) +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */ + +#define _POSIX_SEMAPHORES + +#if defined(__cplusplus) +extern "C" +{ +#endif /* __cplusplus */ + +#if !defined(HAVE_MODE_T) +typedef unsigned int mode_t; +#endif + + +typedef struct sem_t_ * sem_t; + +PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, + int pshared, + unsigned int value); + +PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, + const struct timespec * abstime); + +PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, + int count); + +PTW32_DLLPORT int __cdecl sem_open (const char * name, + int oflag, + mode_t mode, + unsigned int value); + +PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_unlink (const char * name); + +PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, + int * sval); + +#if defined(__cplusplus) +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#undef PTW32_SEMAPHORE_LEVEL +#undef PTW32_SEMAPHORE_LEVEL_MAX + +#endif /* !SEMAPHORE_H */ diff --git a/src/external/pthread/lib/libpthreadGC2.a b/src/external/pthread/lib/libpthreadGC2.a new file mode 100644 index 0000000000000000000000000000000000000000..df211759f80f37494af2d8fcea749957bb51aaa3 GIT binary patch literal 93480 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 literal 0 HcmV?d00001 diff --git a/src/external/pthread/pthreadGC2.dll b/src/external/pthread/pthreadGC2.dll deleted file mode 100644 index 67b9289dfd9f6f1ad12c1d137f4e57ad1a54271c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119888 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

PI35m#66 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