diff options
-rw-r--r-- | implement.h | 274 | ||||
-rw-r--r-- | pthread.h | 889 | ||||
-rw-r--r-- | pthread_cond_wait.c | 124 | ||||
-rw-r--r-- | sched.h | 10 | ||||
-rw-r--r-- | semaphore.h | 22 |
5 files changed, 671 insertions, 648 deletions
diff --git a/implement.h b/implement.h index 34eb826..ae8f32e 100644 --- a/implement.h +++ b/implement.h @@ -83,14 +83,14 @@ typedef enum { * The thread is still "alive" if the numeric value of the * state is greater or equal "PThreadStateRunning". */ - PThreadStateInitial = 0, /* Thread not running */ - PThreadStateRunning, /* Thread alive & kicking */ - PThreadStateSuspended, /* Thread alive but suspended */ - PThreadStateCanceling, /* Thread alive but is */ - /* in the process of terminating */ - /* due to a cancellation request */ - PThreadStateException, /* Thread alive but exiting */ - /* due to an exception */ + PThreadStateInitial = 0, /* Thread not running */ + PThreadStateRunning, /* Thread alive & kicking */ + PThreadStateSuspended, /* Thread alive but suspended */ + PThreadStateCanceling, /* Thread alive but is */ + /* in the process of terminating */ + /* due to a cancellation request */ + PThreadStateException, /* Thread alive but exiting */ + /* due to an exception */ PThreadStateLast } PThreadState; @@ -101,11 +101,11 @@ typedef enum { * This enumeration represents the reason why a thread has * terminated/is terminating. */ - PThreadDemisePeaceful = 0, /* Death due natural causes */ - PThreadDemiseCancelled, /* Death due to user cancel */ - PThreadDemiseException, /* Death due to unhandled */ - /* exception */ - PThreadDemiseNotDead /* I'm not dead! */ + PThreadDemisePeaceful = 0, /* Death due natural causes */ + PThreadDemiseCancelled, /* Death due to user cancel */ + PThreadDemiseException, /* Death due to unhandled */ + /* exception */ + PThreadDemiseNotDead /* I'm not dead! */ } PThreadDemise; @@ -168,9 +168,9 @@ struct pthread_attr_t_ { struct sem_t_ { #ifdef NEED_SEM - unsigned int value; + unsigned int value; CRITICAL_SECTION sem_lock_cs; - HANDLE event; + HANDLE event; #else /* NEED_SEM */ HANDLE sem; #endif /* NEED_SEM */ @@ -180,19 +180,19 @@ struct sem_t_ { #define PTW32_OBJECT_INVALID NULL struct pthread_mutex_t_ { - LONG lock_idx; /* Provides exclusive access to mutex state - via the Interlocked* mechanism, as well - as a count of the number of threads - waiting on the mutex. */ - int recursive_count; /* Number of unlocks a thread needs to perform - before the lock is released (recursive - mutexes only). */ - int kind; /* Mutex type. */ + LONG lock_idx; /* Provides exclusive access to mutex state + via the Interlocked* mechanism, as well + as a count of the number of threads + waiting on the mutex. */ + int recursive_count; /* Number of unlocks a thread needs to perform + before the lock is released (recursive + mutexes only). */ + int kind; /* Mutex type. */ pthread_t ownerThread; - sem_t wait_sema; /* Mutex release notification to waiting - threads. */ + sem_t wait_sema; /* Mutex release notification to waiting + threads. */ CRITICAL_SECTION wait_cs; /* Serialise lock_idx decrement after mutex - timeout. */ + timeout. */ }; struct pthread_mutexattr_t_ { @@ -222,10 +222,10 @@ struct pthread_mutexattr_t_ { #define PTW32_SPIN_USE_MUTEX (3) struct pthread_spinlock_t_ { - long interlock; /* Locking element for multi-cpus. */ + long interlock; /* Locking element for multi-cpus. */ union { - int cpus; /* No. of cpus if multi cpus, or */ - pthread_mutex_t mutex; /* mutex if single cpu. */ + int cpus; /* No. of cpus if multi cpus, or */ + pthread_mutex_t mutex; /* mutex if single cpu. */ } u; }; @@ -260,18 +260,18 @@ struct ThreadParms { struct pthread_cond_t_ { - long nWaitersBlocked; /* Number of threads blocked */ - long nWaitersGone; /* Number of threads timed out */ - long nWaitersToUnblock; /* Number of threads to unblock */ - sem_t semBlockQueue; /* Queue up threads waiting for the */ - /* condition to become signalled */ - sem_t semBlockLock; /* Semaphore that guards access to */ - /* | waiters blocked count/block queue */ - /* +-> Mandatory Sync.LEVEL-1 */ - pthread_mutex_t mtxUnblockLock; /* Mutex that guards access to */ - /* | waiters (to)unblock(ed) counts */ - /* +-> Optional* Sync.LEVEL-2 */ - pthread_cond_t next; /* Doubly linked list */ + long nWaitersBlocked; /* Number of threads blocked */ + long nWaitersGone; /* Number of threads timed out */ + long nWaitersToUnblock; /* Number of threads to unblock */ + sem_t semBlockQueue; /* Queue up threads waiting for the */ + /* condition to become signalled */ + sem_t semBlockLock; /* Semaphore that guards access to */ + /* | waiters blocked count/block queue */ + /* +-> Mandatory Sync.LEVEL-1 */ + pthread_mutex_t mtxUnblockLock; /* Mutex that guards access to */ + /* | waiters (to)unblock(ed) counts */ + /* +-> Optional* Sync.LEVEL-2 */ + pthread_cond_t next; /* Doubly linked list */ pthread_cond_t prev; }; @@ -286,65 +286,65 @@ struct pthread_rwlock_t_ { pthread_mutex_t mtxExclusiveAccess; pthread_mutex_t mtxSharedAccessCompleted; pthread_cond_t cndSharedAccessCompleted; - int nSharedAccessCount; - int nExclusiveAccessCount; - int nCompletedSharedAccessCount; - int nMagic; + int nSharedAccessCount; + int nExclusiveAccessCount; + int nCompletedSharedAccessCount; + int nMagic; }; struct pthread_rwlockattr_t_ { - int pshared; + int pshared; }; struct ThreadKeyAssoc { /* * Purpose: - * This structure creates an association between a - * thread and a key. - * It is used to implement the implicit invocation - * of a user defined destroy routine for thread - * specific data registered by a user upon exiting a - * thread. + * This structure creates an association between a + * thread and a key. + * It is used to implement the implicit invocation + * of a user defined destroy routine for thread + * specific data registered by a user upon exiting a + * thread. * * Attributes: - * lock - * protects access to the rest of the structure + * lock + * protects access to the rest of the structure * - * thread - * reference to the thread that owns the association. - * As long as this is not NULL, the association remains - * referenced by the pthread_t. + * thread + * reference to the thread that owns the association. + * As long as this is not NULL, the association remains + * referenced by the pthread_t. * - * key - * reference to the key that owns the association. - * As long as this is not NULL, the association remains - * referenced by the pthread_key_t. + * key + * reference to the key that owns the association. + * As long as this is not NULL, the association remains + * referenced by the pthread_key_t. * - * nextKey - * The pthread_t->keys attribute is the head of a - * chain of associations that runs through the nextKey - * link. This chain provides the 1 to many relationship - * between a pthread_t and all pthread_key_t on which - * it called pthread_setspecific. + * nextKey + * The pthread_t->keys attribute is the head of a + * chain of associations that runs through the nextKey + * link. This chain provides the 1 to many relationship + * between a pthread_t and all pthread_key_t on which + * it called pthread_setspecific. * - * nextThread - * The pthread_key_t->threads attribute is the head of - * a chain of assoctiations that runs through the - * nextThreads link. This chain provides the 1 to many - * relationship between a pthread_key_t and all the - * PThreads that have called pthread_setspecific for - * this pthread_key_t. + * nextThread + * The pthread_key_t->threads attribute is the head of + * a chain of assoctiations that runs through the + * nextThreads link. This chain provides the 1 to many + * relationship between a pthread_key_t and all the + * PThreads that have called pthread_setspecific for + * this pthread_key_t. * * * Notes: - * 1) As long as one of the attributes, thread or key, is - * not NULL, the association is being referenced; once - * both are NULL, the association must be released. + * 1) As long as one of the attributes, thread or key, is + * not NULL, the association is being referenced; once + * both are NULL, the association must be released. * - * 2) Under WIN32, an association is only created by - * pthread_setspecific if the user provided a - * destroyRoutine when they created the key. + * 2) Under WIN32, an association is only created by + * pthread_setspecific if the user provided a + * destroyRoutine when they created the key. * * */ @@ -360,30 +360,30 @@ struct ThreadKeyAssoc { /* * -------------------------------------------------------------- * MAKE_SOFTWARE_EXCEPTION - * This macro constructs a software exception code following - * the same format as the standard Win32 error codes as defined - * in WINERROR.H + * This macro constructs a software exception code following + * the same format as the standard Win32 error codes as defined + * in WINERROR.H * Values are 32 bit values layed out as follows: * * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 * +---+-+-+-----------------------+-------------------------------+ - * |Sev|C|R| Facility | Code | + * |Sev|C|R| Facility | Code | * +---+-+-+-----------------------+-------------------------------+ * * Severity Values: */ -#define SE_SUCCESS 0x00 -#define SE_INFORMATION 0x01 -#define SE_WARNING 0x02 -#define SE_ERROR 0x03 +#define SE_SUCCESS 0x00 +#define SE_INFORMATION 0x01 +#define SE_WARNING 0x02 +#define SE_ERROR 0x03 #define MAKE_SOFTWARE_EXCEPTION( _severity, _facility, _exception ) \ -( (DWORD) ( ( (_severity) << 30 ) | /* Severity code */ \ - ( 1 << 29 ) | /* MS=0, User=1 */ \ - ( 0 << 28 ) | /* Reserved */ \ - ( (_facility) << 16 ) | /* Facility Code */ \ - ( (_exception) << 0 ) /* Exception Code */ \ - ) ) +( (DWORD) ( ( (_severity) << 30 ) | /* Severity code */ \ + ( 1 << 29 ) | /* MS=0, User=1 */ \ + ( 0 << 28 ) | /* Reserved */ \ + ( (_facility) << 16 ) | /* Facility Code */ \ + ( (_exception) << 0 ) /* Exception Code */ \ + ) ) /* * We choose one specific Facility/Error code combination to @@ -391,13 +391,13 @@ struct ThreadKeyAssoc { * We store our actual component and error code within * the optional information array. */ -#define EXCEPTION_PTW32_SERVICES \ +#define EXCEPTION_PTW32_SERVICES \ MAKE_SOFTWARE_EXCEPTION( SE_ERROR, \ - PTW32_SERVICES_FACILITY, \ - PTW32_SERVICES_ERROR ) + PTW32_SERVICES_FACILITY, \ + PTW32_SERVICES_ERROR ) -#define PTW32_SERVICES_FACILITY 0xBAD -#define PTW32_SERVICES_ERROR 0xDEED +#define PTW32_SERVICES_FACILITY 0xBAD +#define PTW32_SERVICES_ERROR 0xDEED #endif /* __CLEANUP_SEH */ @@ -407,25 +407,25 @@ struct ThreadKeyAssoc { * generic exception selectors. */ -#define PTW32_EPS_EXIT (1) -#define PTW32_EPS_CANCEL (2) +#define PTW32_EPS_EXIT (1) +#define PTW32_EPS_CANCEL (2) /* Mutex constants */ enum { - PTW32_MUTEX_LOCK_IDX_INIT = -1, + PTW32_MUTEX_LOCK_IDX_INIT = -1, PTW32_MUTEX_OWNER_ANONYMOUS = 1 }; /* Useful macros */ -#define PTW32_MAX(a,b) ((a)<(b)?(b):(a)) -#define PTW32_MIN(a,b) ((a)>(b)?(b):(a)) +#define PTW32_MAX(a,b) ((a)<(b)?(b):(a)) +#define PTW32_MIN(a,b) ((a)>(b)?(b):(a)) /* Declared in global.c */ extern PTW32_INTERLOCKED_LONG (WINAPI *ptw32_interlocked_compare_exchange)(PTW32_INTERLOCKED_LPLONG, - PTW32_INTERLOCKED_LONG, - PTW32_INTERLOCKED_LONG); + PTW32_INTERLOCKED_LONG, + PTW32_INTERLOCKED_LONG); /* Thread Reuse stack bottom marker. Must not be NULL or any valid pointer to memory. */ #define PTW32_THREAD_REUSE_BOTTOM ((pthread_t) 1) @@ -481,8 +481,8 @@ int ptw32_rwlock_check_need_init(pthread_rwlock_t *rwlock); PTW32_INTERLOCKED_LONG WINAPI ptw32_InterlockedCompareExchange(PTW32_INTERLOCKED_LPLONG location, - PTW32_INTERLOCKED_LONG value, - PTW32_INTERLOCKED_LONG comparand); + PTW32_INTERLOCKED_LONG value, + PTW32_INTERLOCKED_LONG comparand); int ptw32_processInitialize (void); @@ -504,6 +504,8 @@ int ptw32_setthreadpriority (pthread_t thread, int policy, int priority); +void ptw32_rwlock_cancelwrwait(void * arg); + #if ! defined (__MINGW32__) || defined (__MSVCRT__) unsigned __stdcall #else @@ -514,8 +516,8 @@ ptw32_threadStart (void * vthreadParms); void ptw32_callUserDestroyRoutines (pthread_t thread); int ptw32_tkAssocCreate (ThreadKeyAssoc ** assocP, - pthread_t thread, - pthread_key_t key); + pthread_t thread, + pthread_key_t key); void ptw32_tkAssocDestroy (ThreadKeyAssoc * assoc); @@ -523,7 +525,7 @@ void ptw32_tkAssocDestroy (ThreadKeyAssoc * assoc); #ifdef NEED_SEM void ptw32_decrease_semaphore(sem_t * sem); BOOL ptw32_increase_semaphore(sem_t * sem, - unsigned int n); + unsigned int n); #endif /* NEED_SEM */ #ifdef NEED_FTIME @@ -537,19 +539,19 @@ void ptw32_filetime_to_timespec(const FILETIME *ft, struct timespec *ts); #ifdef _UWIN_ -# ifdef _MT -# ifdef __cplusplus - extern "C" { -# endif - _CRTIMP unsigned long __cdecl _beginthread (void (__cdecl *) (void *), - unsigned, void *); - _CRTIMP void __cdecl _endthread(void); - _CRTIMP unsigned long __cdecl _beginthreadex(void *, unsigned, - unsigned (__stdcall *) (void *), void *, unsigned, unsigned *); - _CRTIMP void __cdecl _endthreadex(unsigned); -# ifdef __cplusplus - } -# endif +# ifdef _MT +# ifdef __cplusplus + extern "C" { +# endif + _CRTIMP unsigned long __cdecl _beginthread (void (__cdecl *) (void *), + unsigned, void *); + _CRTIMP void __cdecl _endthread(void); + _CRTIMP unsigned long __cdecl _beginthreadex(void *, unsigned, + unsigned (__stdcall *) (void *), void *, unsigned, unsigned *); + _CRTIMP void __cdecl _endthreadex(unsigned); +# ifdef __cplusplus + } +# endif # endif #else # include <process.h> @@ -570,17 +572,17 @@ void ptw32_filetime_to_timespec(const FILETIME *ft, struct timespec *ts); */ #define _beginthreadex(security, \ - stack_size, \ - start_proc, \ - arg, \ - flags, \ - pid) \ - CreateThread(security, \ - stack_size, \ - (LPTHREAD_START_ROUTINE) start_proc, \ - arg, \ - flags, \ - pid) + stack_size, \ + start_proc, \ + arg, \ + flags, \ + pid) \ + CreateThread(security, \ + stack_size, \ + (LPTHREAD_START_ROUTINE) start_proc, \ + arg, \ + flags, \ + pid) #define _endthreadex ExitThread @@ -61,7 +61,7 @@ #ifdef _UWIN # define HAVE_STRUCT_TIMESPEC 1 -# define HAVE_SIGNAL_H 1 +# define HAVE_SIGNAL_H 1 # undef HAVE_CONFIG_H # pragma comment(lib, "pthread") #endif @@ -73,68 +73,68 @@ * Module: pthread.h * * Purpose: - * Provides an implementation of PThreads based upon the - * standard: + * Provides an implementation of PThreads based upon the + * standard: * - * POSIX 1003.1-2001 + * POSIX 1003.1-2001 * and * The Single Unix Specification version 3 * * (these two are equivalent) * - * in order to enhance code portability between Windows, + * 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. + * 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. + * 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. + * Contributors are listed in the CONTRIBUTORS file. * - * As usual, all bouquets go to the contributors, and all - * brickbats go to the project maintainer. + * 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 + * The code base for this project is coordinated and + * eventually pre-tested, packaged, and made available by * - * Ross Johnson <rpj@ise.canberra.edu.au> + * Ross Johnson <rpj@ise.canberra.edu.au> * * 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. + * 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. + * 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 + * The source code and other information about this library + * are available from * - * http://sources.redhat.com/pthreads-win32/ + * http://sources.redhat.com/pthreads-win32/ * * ------------------------------------------------------------- */ @@ -269,8 +269,8 @@ enum { #ifndef HAVE_STRUCT_TIMESPEC struct timespec { - long tv_sec; - long tv_nsec; + long tv_sec; + long tv_nsec; }; #endif /* HAVE_STRUCT_TIMESPEC */ @@ -289,7 +289,7 @@ struct timespec { #ifdef __cplusplus extern "C" { -#endif /* __cplusplus */ +#endif /* __cplusplus */ /* * ------------------------------------------------------------- @@ -298,108 +298,108 @@ extern "C" * ========================= * * _POSIX_THREADS (set) - * If set, you can use threads + * If set, you can use threads * * _POSIX_THREAD_ATTR_STACKSIZE (set) - * If set, you can control the size of a thread's - * stack - * pthread_attr_getstacksize - * pthread_attr_setstacksize + * If set, you can control the size of a thread's + * stack + * pthread_attr_getstacksize + * pthread_attr_setstacksize * * _POSIX_THREAD_ATTR_STACKADDR (not set) - * If set, 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 + * If set, 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 (set) - * If set, you can use realtime scheduling. - * Indicates the availability of: - * pthread_attr_getinheritsched - * pthread_attr_getschedparam - * pthread_attr_getschedpolicy - * pthread_attr_getscope - * pthread_attr_setinheritsched - * pthread_attr_setschedparam - * pthread_attr_setschedpolicy - * pthread_attr_setscope - * pthread_getschedparam - * pthread_setschedparam - * sched_get_priority_max - * sched_get_priority_min - * sched_rr_set_interval + * If set, you can use realtime scheduling. + * Indicates the availability of: + * pthread_attr_getinheritsched + * pthread_attr_getschedparam + * pthread_attr_getschedpolicy + * pthread_attr_getscope + * pthread_attr_setinheritsched + * pthread_attr_setschedparam + * pthread_attr_setschedpolicy + * pthread_attr_setscope + * pthread_getschedparam + * pthread_setschedparam + * sched_get_priority_max + * sched_get_priority_min + * sched_rr_set_interval * * _POSIX_THREAD_PRIO_INHERIT (not set) - * If set, you can create priority inheritance - * mutexes. - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprotocol + + * If set, you can create priority inheritance + * mutexes. + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprotocol + * * _POSIX_THREAD_PRIO_PROTECT (not set) - * If set, 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 + + * If set, 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 (not set) - * 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 + * 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 (set) - * If set you can use the special *_r library - * functions that provide thread-safe behaviour + * If set you can use the special *_r library + * functions that provide thread-safe behaviour * * _POSIX_READER_WRITER_LOCKS (set) - * If set, you can use read/write locks + * If set, you can use read/write locks * * _POSIX_SPIN_LOCKS (set) - * If set, you can use spin locks + * If set, you can use spin locks * * _POSIX_BARRIERS (set) - * If set, you can use barriers + * If set, you can use barriers * - * + These functions provide both 'inherit' and/or - * 'protect' protocol, based upon these macro - * settings. + * + These functions provide both 'inherit' and/or + * 'protect' protocol, based upon these macro + * settings. * * POSIX 1003.1-2001 Limits * =========================== * * PTHREAD_DESTRUCTOR_ITERATIONS - * Maximum number of attempts to destroy - * a thread's thread-specific data on - * termination (must be at least 4) + * 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) + * 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 + * Minimum supported stack size for a thread * * PTHREAD_THREADS_MAX - * Maximum number of threads supported per - * process (must be at least 64). + * Maximum number of threads supported per + * process (must be at least 64). * * _POSIX_SEM_NSEMS_MAX - * The maximum number of semaphores a process can have. - * (only defined if not already defined) + * The maximum number of semaphores a process can have. + * (only defined if not already defined) * * _POSIX_SEM_VALUE_MAX - * The maximum value a semaphore can have. - * (only defined if not already defined) + * The maximum value a semaphore can have. + * (only defined if not already defined) * * ------------------------------------------------------------- */ @@ -436,47 +436,47 @@ extern "C" #define _POSIX_THREAD_PRIO_PROTECT #define _POSIX_THREAD_PROCESS_SHARED -#endif /* KLUDGE */ +#endif /* KLUDGE */ /* * POSIX Limits * - * PTHREAD_DESTRUCTOR_ITERATIONS - * Standard states this must be at least - * 4. + * PTHREAD_DESTRUCTOR_ITERATIONS + * Standard states this must be at least + * 4. * - * PTHREAD_KEYS_MAX - * WIN32 permits only 64 TLS keys per process. - * This limitation could be worked around by - * simply simulating keys. + * PTHREAD_KEYS_MAX + * WIN32 permits only 64 TLS keys per process. + * This limitation could be worked around by + * simply simulating keys. * - * PTHREADS_STACK_MIN - * POSIX specifies 0 which is also the value WIN32 - * interprets as allowing the system to - * set the size to that of the main thread. The - * maximum stack size in Win32 is 1Meg. WIN32 - * allocates more stack as required up to the 1Meg - * limit. + * PTHREADS_STACK_MIN + * POSIX specifies 0 which is also the value WIN32 + * interprets as allowing the system to + * set the size to that of the main thread. The + * maximum stack size in Win32 is 1Meg. WIN32 + * allocates more stack as required up to the 1Meg + * limit. * - * PTHREAD_THREADS_MAX - * Not documented by WIN32. Wrote a test program - * that kept creating threads until it failed - * revealed this approximate number (Windows NT). - * This number is somewhat less for Windows 9x - * and is effectively less than 64. Perhaps this - * constant should be set at DLL load time. + * PTHREAD_THREADS_MAX + * Not documented by WIN32. Wrote a test program + * that kept creating threads until it failed + * revealed this approximate number (Windows NT). + * This number is somewhat less for Windows 9x + * and is effectively less than 64. Perhaps this + * constant should be set at DLL load time. * */ -#define PTHREAD_DESTRUCTOR_ITERATIONS 4 -#define PTHREAD_KEYS_MAX 64 -#define PTHREAD_STACK_MIN 0 -#define PTHREAD_THREADS_MAX 2019 +#define PTHREAD_DESTRUCTOR_ITERATIONS 4 +#define PTHREAD_KEYS_MAX 64 +#define PTHREAD_STACK_MIN 0 +#define PTHREAD_THREADS_MAX 2019 #ifndef _POSIX_SEM_NSEMS_MAX /* Not used and only an arbitrary value. */ -# define _POSIX_SEM_NSEMS_MAX 1024 +# define _POSIX_SEM_NSEMS_MAX 1024 #endif #ifndef _POSIX_SEM_VALUE_MAX -# define _POSIX_SEM_VALUE_MAX (INT_MAX/2) +# define _POSIX_SEM_VALUE_MAX (INT_MAX/2) #endif #if __GNUC__ && ! defined (__declspec) @@ -497,8 +497,19 @@ extern "C" # endif #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 function prototypes. + * + * We force all calls to cdecl even though this will slow Watcom code down + * slightly. If you know that the Watcom compiler will be used to build both + * the DLL and application, then you could probably define this as a null string. + */ +#define PTW32_CDECL __cdecl + #if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX -# include <sys/types.h> +# include <sys/types.h> #else typedef struct pthread_t_ *pthread_t; typedef struct pthread_attr_t_ *pthread_attr_t; @@ -527,39 +538,39 @@ enum { /* * pthread_attr_{get,set}detachstate */ - PTHREAD_CREATE_JOINABLE = 0, /* Default */ - PTHREAD_CREATE_DETACHED = 1, + PTHREAD_CREATE_JOINABLE = 0, /* Default */ + PTHREAD_CREATE_DETACHED = 1, /* * pthread_attr_{get,set}inheritsched */ - PTHREAD_INHERIT_SCHED = 0, - PTHREAD_EXPLICIT_SCHED = 1, /* Default */ + PTHREAD_INHERIT_SCHED = 0, + PTHREAD_EXPLICIT_SCHED = 1, /* Default */ /* * pthread_{get,set}scope */ - PTHREAD_SCOPE_PROCESS = 0, - PTHREAD_SCOPE_SYSTEM = 1, /* Default */ + PTHREAD_SCOPE_PROCESS = 0, + PTHREAD_SCOPE_SYSTEM = 1, /* Default */ /* * pthread_setcancelstate paramters */ - PTHREAD_CANCEL_ENABLE = 0, /* Default */ - PTHREAD_CANCEL_DISABLE = 1, + PTHREAD_CANCEL_ENABLE = 0, /* Default */ + PTHREAD_CANCEL_DISABLE = 1, /* * pthread_setcanceltype parameters */ - PTHREAD_CANCEL_ASYNCHRONOUS = 0, - PTHREAD_CANCEL_DEFERRED = 1, /* Default */ + 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_PROCESS_PRIVATE = 0, + PTHREAD_PROCESS_SHARED = 1, /* * pthread_barrier_wait @@ -584,13 +595,13 @@ enum { * ==================== * ==================== */ -#define PTHREAD_ONCE_INIT { PTW32_FALSE, -1 } +#define PTHREAD_ONCE_INIT { PTW32_FALSE, -1 } struct pthread_once_t_ { - int done; /* indicates if user function executed */ - long started; /* First thread to increment this value */ - /* to zero executes the user function */ + int done; /* indicates if user function executed */ + long started; /* First thread to increment this value */ + /* to zero executes the user function */ }; @@ -668,7 +679,17 @@ enum #endif typedef struct ptw32_cleanup_t ptw32_cleanup_t; -typedef void (__cdecl *ptw32_cleanup_callback_t)(void *); + +#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 { @@ -678,125 +699,125 @@ struct ptw32_cleanup_t }; #ifdef __CLEANUP_SEH - /* - * WIN32 SEH version of cancel cleanup. - */ + /* + * 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 \ - { \ + { \ + 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 ); \ - } \ - } \ - } + } \ + __finally \ + { \ + if( _execute || AbnormalTermination()) \ + { \ + (*(_cleanup.routine))( _cleanup.arg ); \ + } \ + } \ + } #else /* __CLEANUP_SEH */ #ifdef __CLEANUP_C - /* - * C implementation of PThreads cancel cleanup - */ + /* + * 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) ); \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ #define pthread_cleanup_pop( _execute ) \ - (void) ptw32_pop_cleanup( _execute ); \ - } + (void) ptw32_pop_cleanup( _execute ); \ + } #else /* __CLEANUP_C */ #ifdef __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) - */ + /* + * 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 - */ + 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) ); + { \ + PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ + (void *) (_arg) ); #define pthread_cleanup_pop( _execute ) \ - cleanup.execute( _execute ); \ - } + cleanup.execute( _execute ); \ + } #else @@ -819,259 +840,259 @@ struct ptw32_cleanup_t /* * PThread Attribute Functions */ -PTW32_DLLPORT int pthread_attr_init (pthread_attr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); -PTW32_DLLPORT int pthread_attr_destroy (pthread_attr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); -PTW32_DLLPORT int pthread_attr_getdetachstate (const pthread_attr_t * attr, - int *detachstate); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, + int *detachstate); -PTW32_DLLPORT int pthread_attr_getstackaddr (const pthread_attr_t * attr, - void **stackaddr); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, + void **stackaddr); -PTW32_DLLPORT int pthread_attr_getstacksize (const pthread_attr_t * attr, - size_t * stacksize); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, + size_t * stacksize); -PTW32_DLLPORT int pthread_attr_setdetachstate (pthread_attr_t * attr, - int detachstate); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, + int detachstate); -PTW32_DLLPORT int pthread_attr_setstackaddr (pthread_attr_t * attr, - void *stackaddr); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, + void *stackaddr); -PTW32_DLLPORT int pthread_attr_setstacksize (pthread_attr_t * attr, - size_t stacksize); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, + size_t stacksize); -PTW32_DLLPORT int pthread_attr_getschedparam (const pthread_attr_t *attr, - struct sched_param *param); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param); -PTW32_DLLPORT int pthread_attr_setschedparam (pthread_attr_t *attr, - const struct sched_param *param); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param); -PTW32_DLLPORT int pthread_attr_setschedpolicy (pthread_attr_t *, - int); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, + int); -PTW32_DLLPORT int pthread_attr_getschedpolicy (pthread_attr_t *, - int *); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (pthread_attr_t *, + int *); -PTW32_DLLPORT int pthread_attr_setinheritsched(pthread_attr_t * attr, - int inheritsched); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, + int inheritsched); -PTW32_DLLPORT int pthread_attr_getinheritsched(pthread_attr_t * attr, - int * inheritsched); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(pthread_attr_t * attr, + int * inheritsched); -PTW32_DLLPORT int pthread_attr_setscope (pthread_attr_t *, - int); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, + int); -PTW32_DLLPORT int pthread_attr_getscope (const pthread_attr_t *, - int *); +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, + int *); /* * PThread Functions */ -PTW32_DLLPORT int pthread_create (pthread_t * tid, - const pthread_attr_t * attr, - void *(*start) (void *), - void *arg); +PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void *(*start) (void *), + void *arg); -PTW32_DLLPORT int pthread_detach (pthread_t tid); +PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); -PTW32_DLLPORT int pthread_equal (pthread_t t1, - pthread_t t2); +PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, + pthread_t t2); -PTW32_DLLPORT void pthread_exit (void *value_ptr); +PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); -PTW32_DLLPORT int pthread_join (pthread_t thread, - void **value_ptr); +PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, + void **value_ptr); -PTW32_DLLPORT pthread_t pthread_self (void); +PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); -PTW32_DLLPORT int pthread_cancel (pthread_t thread); +PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); -PTW32_DLLPORT int pthread_setcancelstate (int state, - int *oldstate); +PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, + int *oldstate); -PTW32_DLLPORT int pthread_setcanceltype (int type, - int *oldtype); +PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, + int *oldtype); -PTW32_DLLPORT void pthread_testcancel (void); +PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); -PTW32_DLLPORT int pthread_once (pthread_once_t * once_control, - void (*init_routine) (void)); +PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, + void (*init_routine) (void)); #if PTW32_LEVEL >= PTW32_LEVEL_MAX -PTW32_DLLPORT ptw32_cleanup_t *ptw32_pop_cleanup (int execute); +PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); -PTW32_DLLPORT void ptw32_push_cleanup (ptw32_cleanup_t * cleanup, - void (*routine) (void *), - void *arg); +PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, + void (*routine) (void *), + void *arg); #endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ /* * Thread Specific Data Functions */ -PTW32_DLLPORT int pthread_key_create (pthread_key_t * key, - void (*destructor) (void *)); +PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, + void (*destructor) (void *)); -PTW32_DLLPORT int pthread_key_delete (pthread_key_t key); +PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); -PTW32_DLLPORT int pthread_setspecific (pthread_key_t key, - const void *value); +PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, + const void *value); -PTW32_DLLPORT void *pthread_getspecific (pthread_key_t key); +PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); /* * Mutex Attribute Functions */ -PTW32_DLLPORT int pthread_mutexattr_init (pthread_mutexattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); -PTW32_DLLPORT int pthread_mutexattr_destroy (pthread_mutexattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); -PTW32_DLLPORT int pthread_mutexattr_getpshared (const pthread_mutexattr_t - * attr, - int *pshared); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t + * attr, + int *pshared); -PTW32_DLLPORT int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, - int pshared); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, + int pshared); -PTW32_DLLPORT int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); -PTW32_DLLPORT int pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind); /* * Barrier Attribute Functions */ -PTW32_DLLPORT int pthread_barrierattr_init (pthread_barrierattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); -PTW32_DLLPORT int pthread_barrierattr_destroy (pthread_barrierattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); -PTW32_DLLPORT int pthread_barrierattr_getpshared (const pthread_barrierattr_t - * attr, - int *pshared); +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t + * attr, + int *pshared); -PTW32_DLLPORT int pthread_barrierattr_setpshared (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 pthread_mutex_init (pthread_mutex_t * mutex, - const pthread_mutexattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, + const pthread_mutexattr_t * attr); -PTW32_DLLPORT int pthread_mutex_destroy (pthread_mutex_t * mutex); +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); -PTW32_DLLPORT int pthread_mutex_lock (pthread_mutex_t * mutex); +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); -PTW32_DLLPORT int pthread_mutex_timedlock(pthread_mutex_t *mutex, - const struct timespec *abstime); +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t *mutex, + const struct timespec *abstime); -PTW32_DLLPORT int pthread_mutex_trylock (pthread_mutex_t * mutex); +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); -PTW32_DLLPORT int pthread_mutex_unlock (pthread_mutex_t * mutex); +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); /* * Spinlock Functions */ -PTW32_DLLPORT int pthread_spin_init (pthread_spinlock_t * lock, int pshared); +PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); -PTW32_DLLPORT int pthread_spin_destroy (pthread_spinlock_t * lock); +PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); -PTW32_DLLPORT int pthread_spin_lock (pthread_spinlock_t * lock); +PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); -PTW32_DLLPORT int pthread_spin_trylock (pthread_spinlock_t * lock); +PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); -PTW32_DLLPORT int pthread_spin_unlock (pthread_spinlock_t * lock); +PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); /* * Barrier Functions */ -PTW32_DLLPORT int pthread_barrier_init (pthread_barrier_t * barrier, - const pthread_barrierattr_t * attr, - unsigned int count); +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, + unsigned int count); -PTW32_DLLPORT int pthread_barrier_destroy (pthread_barrier_t * barrier); +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); -PTW32_DLLPORT int pthread_barrier_wait (pthread_barrier_t * barrier); +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); /* * Condition Variable Attribute Functions */ -PTW32_DLLPORT int pthread_condattr_init (pthread_condattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); -PTW32_DLLPORT int pthread_condattr_destroy (pthread_condattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); -PTW32_DLLPORT int pthread_condattr_getpshared (const pthread_condattr_t * attr, - int *pshared); +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, + int *pshared); -PTW32_DLLPORT int pthread_condattr_setpshared (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 pthread_cond_init (pthread_cond_t * cond, - const pthread_condattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, + const pthread_condattr_t * attr); -PTW32_DLLPORT int pthread_cond_destroy (pthread_cond_t * cond); +PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); -PTW32_DLLPORT int pthread_cond_wait (pthread_cond_t * cond, - pthread_mutex_t * mutex); +PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex); -PTW32_DLLPORT int pthread_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime); +PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime); -PTW32_DLLPORT int pthread_cond_signal (pthread_cond_t * cond); +PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); -PTW32_DLLPORT int pthread_cond_broadcast (pthread_cond_t * cond); +PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); /* * Scheduling */ -PTW32_DLLPORT int pthread_setschedparam (pthread_t thread, - int policy, - const struct sched_param *param); +PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, + int policy, + const struct sched_param *param); -PTW32_DLLPORT int pthread_getschedparam (pthread_t thread, - int *policy, - struct sched_param *param); +PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, + int *policy, + struct sched_param *param); -PTW32_DLLPORT int pthread_setconcurrency (int); +PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); -PTW32_DLLPORT int pthread_getconcurrency (void); +PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); /* * Read-Write Lock Functions */ -PTW32_DLLPORT int pthread_rwlock_init(pthread_rwlock_t *lock, - const pthread_rwlockattr_t *attr); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, + const pthread_rwlockattr_t *attr); -PTW32_DLLPORT int pthread_rwlock_destroy(pthread_rwlock_t *lock); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); -PTW32_DLLPORT int pthread_rwlock_tryrdlock(pthread_rwlock_t *); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); -PTW32_DLLPORT int pthread_rwlock_trywrlock(pthread_rwlock_t *); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); -PTW32_DLLPORT int pthread_rwlock_rdlock(pthread_rwlock_t *lock); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); -PTW32_DLLPORT int pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, - const struct timespec *abstime); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, + const struct timespec *abstime); -PTW32_DLLPORT int pthread_rwlock_wrlock(pthread_rwlock_t *lock); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); -PTW32_DLLPORT int pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, - const struct timespec *abstime); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, + const struct timespec *abstime); -PTW32_DLLPORT int pthread_rwlock_unlock(pthread_rwlock_t *lock); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); -PTW32_DLLPORT int pthread_rwlockattr_init (pthread_rwlockattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); -PTW32_DLLPORT int pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); -PTW32_DLLPORT int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, - int *pshared); +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, + int *pshared); -PTW32_DLLPORT int pthread_rwlockattr_setpshared (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 @@ -1079,7 +1100,7 @@ PTW32_DLLPORT int pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, * Signal Functions. Should be defined in <signal.h> but MSVC and MinGW32 * already have signal.h that don't define these. */ -PTW32_DLLPORT int pthread_kill(pthread_t thread, int sig); +PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); /* * Non-portable functions @@ -1088,25 +1109,25 @@ PTW32_DLLPORT int pthread_kill(pthread_t thread, int sig); /* * Compatibility with Linux. */ -PTW32_DLLPORT int pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, - int kind); -PTW32_DLLPORT int pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, - int *kind); +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 pthread_delay_np (struct timespec * interval); -PTW32_DLLPORT int pthread_num_processors_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); +PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); /* * Useful if an application wants to statically link * the lib rather than load the DLL at run-time. */ -PTW32_DLLPORT int pthread_win32_process_attach_np(void); -PTW32_DLLPORT int pthread_win32_process_detach_np(void); -PTW32_DLLPORT int pthread_win32_thread_attach_np(void); -PTW32_DLLPORT int pthread_win32_thread_detach_np(void); +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); /* * Register a system time change with the library. @@ -1116,7 +1137,7 @@ PTW32_DLLPORT int pthread_win32_thread_detach_np(void); * WM_TIMECHANGE message. It can be passed directly to * pthread_create() as a new thread if desired. */ -PTW32_DLLPORT void * pthread_timechange_handler_np(void *); +PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); #endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ @@ -1125,7 +1146,7 @@ PTW32_DLLPORT void * pthread_timechange_handler_np(void *); /* * Returns the Win32 HANDLE for the POSIX thread. */ -PTW32_DLLPORT HANDLE pthread_getw32threadhandle_np(pthread_t thread); +PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); /* @@ -1136,16 +1157,16 @@ PTW32_DLLPORT HANDLE pthread_getw32threadhandle_np(pthread_t thread); * This function allows the caller to hook into the * PThreads cancel mechanism. It is implemented using * - * WaitForMultipleObjects + * 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 pthreadCancelableWait (HANDLE waitHandle); -PTW32_DLLPORT int pthreadCancelableTimedWait (HANDLE waitHandle, - DWORD timeout); +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, + DWORD timeout); #endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ @@ -1154,12 +1175,12 @@ PTW32_DLLPORT int pthreadCancelableTimedWait (HANDLE waitHandle, */ #ifndef _UWIN # if defined(NEED_ERRNO) - PTW32_DLLPORT int * _errno( void ); + PTW32_DLLPORT int * PTW32_CDECL _errno( void ); # else # ifndef errno # if (defined(_MT) || defined(_DLL)) - __declspec(dllimport) extern int * __cdecl _errno(void); -# define errno (*_errno()) + __declspec(dllimport) extern int * __cdecl _errno(void); +# define errno (*_errno()) # endif # endif # endif @@ -1176,27 +1197,27 @@ PTW32_DLLPORT int pthreadCancelableTimedWait (HANDLE waitHandle, #if !defined(__MINGW32__) #define strtok_r( _s, _sep, _lasts ) \ - ( *(_lasts) = strtok( (_s), (_sep) ) ) + ( *(_lasts) = strtok( (_s), (_sep) ) ) #endif /* !__MINGW32__ */ #define asctime_r( _tm, _buf ) \ - ( strcpy( (_buf), asctime( (_tm) ) ), \ - (_buf) ) + ( strcpy( (_buf), asctime( (_tm) ) ), \ + (_buf) ) #define ctime_r( _clock, _buf ) \ - ( strcpy( (_buf), ctime( (_clock) ) ), \ - (_buf) ) + ( strcpy( (_buf), ctime( (_clock) ) ), \ + (_buf) ) #define gmtime_r( _clock, _result ) \ - ( *(_result) = *gmtime( (_clock) ), \ - (_result) ) + ( *(_result) = *gmtime( (_clock) ), \ + (_result) ) #define localtime_r( _clock, _result ) \ - ( *(_result) = *localtime( (_clock) ), \ - (_result) ) + ( *(_result) = *localtime( (_clock) ), \ + (_result) ) #define rand_r( _seed ) \ - ( _seed == _seed? rand() : rand() ) + ( _seed == _seed? rand() : rand() ) #ifdef __cplusplus @@ -1216,7 +1237,7 @@ class ptw32_exception_exit : public ptw32_exception {}; /* * Get internal SEH tag */ -PTW32_DLLPORT DWORD ptw32_get_exception_services_code(void); +PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); #endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ @@ -1229,8 +1250,8 @@ PTW32_DLLPORT DWORD ptw32_get_exception_services_code(void); * 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 ) ) + __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ + ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) #endif /* __CLEANUP_SEH */ @@ -1241,10 +1262,10 @@ PTW32_DLLPORT DWORD ptw32_get_exception_services_code(void); * propagate our internal exceptions up to the library's internal handlers. */ #ifdef _MSC_VER - /* - * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' - * if you want Pthread-Win32 cancelation and pthread_exit to work. - */ + /* + * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' + * if you want Pthread-Win32 cancelation and pthread_exit to work. + */ #ifndef PtW32NoCatchWarn @@ -1260,22 +1281,22 @@ PTW32_DLLPORT DWORD ptw32_get_exception_services_code(void); #pragma message(" #else") #pragma message(" catch(...)") #pragma message(" #endif") -#pragma message(" {") -#pragma message(" /* Catchall block processing */") -#pragma message(" }") +#pragma message(" {") +#pragma message(" /* Catchall block processing */") +#pragma message(" }") #pragma message("------------------------------------------------------------------") #endif #define PtW32CatchAll \ - catch( ptw32_exception & ) { throw; } \ - catch( ... ) + catch( ptw32_exception & ) { throw; } \ + catch( ... ) #else /* _MSC_VER */ #define catch( E ) \ - catch( ptw32_exception & ) { throw; } \ - catch( E ) + catch( ptw32_exception & ) { throw; } \ + catch( E ) #endif /* _MSC_VER */ @@ -1284,8 +1305,8 @@ PTW32_DLLPORT DWORD ptw32_get_exception_services_code(void); #endif /* ! PTW32_BUILD */ #ifdef __cplusplus -} /* End of extern "C" */ -#endif /* __cplusplus */ +} /* End of extern "C" */ +#endif /* __cplusplus */ #ifdef PTW32__HANDLE_DEF # undef HANDLE diff --git a/pthread_cond_wait.c b/pthread_cond_wait.c index cfd1ee8..57fc978 100644 --- a/pthread_cond_wait.c +++ b/pthread_cond_wait.c @@ -265,19 +265,21 @@ * Arguments for cond_wait_cleanup, since we can only pass a * single void * to it. */ -typedef struct { - pthread_mutex_t * mutexPtr; +typedef struct +{ + pthread_mutex_t *mutexPtr; pthread_cond_t cv; - int * resultPtr; + int *resultPtr; int signaled; } ptw32_cond_wait_cleanup_args_t; -static void -ptw32_cond_wait_cleanup(void * args) +static void PTW32_CDECL +ptw32_cond_wait_cleanup (void *args) { - ptw32_cond_wait_cleanup_args_t * cleanup_args = (ptw32_cond_wait_cleanup_args_t *) args; + ptw32_cond_wait_cleanup_args_t *cleanup_args = + (ptw32_cond_wait_cleanup_args_t *) args; pthread_cond_t cv = cleanup_args->cv; - int * resultPtr = cleanup_args->resultPtr; + int *resultPtr = cleanup_args->resultPtr; int nSignalsWasLeft; int result; @@ -287,72 +289,71 @@ ptw32_cond_wait_cleanup(void * args) * longer waiting. The waiter is responsible for adjusting waiters * (to)unblock(ed) counts (protected by unblock lock). */ - if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) + if ((result = pthread_mutex_lock (&(cv->mtxUnblockLock))) != 0) { *resultPtr = result; return; } - if ( 0 != (nSignalsWasLeft = cv->nWaitersToUnblock) ) + if (0 != (nSignalsWasLeft = cv->nWaitersToUnblock)) { --(cv->nWaitersToUnblock); } - else if ( INT_MAX/2 == ++(cv->nWaitersGone) ) + else if (INT_MAX / 2 == ++(cv->nWaitersGone)) { - if (sem_wait( &(cv->semBlockLock) ) != 0) - { - *resultPtr = errno; - /* - * This is a fatal error for this CV, - * so we deliberately don't unlock - * cv->mtxUnblockLock before returning. - */ - return; - } + if (sem_wait (&(cv->semBlockLock)) != 0) + { + *resultPtr = errno; + /* + * This is a fatal error for this CV, + * so we deliberately don't unlock + * cv->mtxUnblockLock before returning. + */ + return; + } cv->nWaitersBlocked -= cv->nWaitersGone; - if (sem_post( &(cv->semBlockLock) ) != 0) - { - *resultPtr = errno; - /* - * This is a fatal error for this CV, - * so we deliberately don't unlock - * cv->mtxUnblockLock before returning. - */ - return; - } + if (sem_post (&(cv->semBlockLock)) != 0) + { + *resultPtr = errno; + /* + * This is a fatal error for this CV, + * so we deliberately don't unlock + * cv->mtxUnblockLock before returning. + */ + return; + } cv->nWaitersGone = 0; } - if ((result = pthread_mutex_unlock(&(cv->mtxUnblockLock))) != 0) + if ((result = pthread_mutex_unlock (&(cv->mtxUnblockLock))) != 0) { *resultPtr = result; return; } - if ( 1 == nSignalsWasLeft ) + if (1 == nSignalsWasLeft) { - if (sem_post(&(cv->semBlockLock)) != 0) - { - *resultPtr = errno; - return; - } + if (sem_post (&(cv->semBlockLock)) != 0) + { + *resultPtr = errno; + return; + } } /* * XSH: Upon successful return, the mutex has been locked and is owned * by the calling thread */ - if ((result = pthread_mutex_lock(cleanup_args->mutexPtr)) != 0) + if ((result = pthread_mutex_lock (cleanup_args->mutexPtr)) != 0) { *resultPtr = result; } -} /* ptw32_cond_wait_cleanup */ +} /* ptw32_cond_wait_cleanup */ static INLINE int -ptw32_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime) +ptw32_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, const struct timespec *abstime) { int result = 0; pthread_cond_t cv; @@ -371,7 +372,7 @@ ptw32_cond_timedwait (pthread_cond_t * cond, */ if (*cond == PTHREAD_COND_INITIALIZER) { - result = ptw32_cond_check_need_init(cond); + result = ptw32_cond_check_need_init (cond); } if (result != 0 && result != EBUSY) @@ -381,14 +382,14 @@ ptw32_cond_timedwait (pthread_cond_t * cond, cv = *cond; - if (sem_wait(&(cv->semBlockLock)) != 0) + if (sem_wait (&(cv->semBlockLock)) != 0) { return errno; } ++(cv->nWaitersBlocked); - if (sem_post(&(cv->semBlockLock)) != 0) + if (sem_post (&(cv->semBlockLock)) != 0) { return errno; } @@ -409,12 +410,12 @@ ptw32_cond_timedwait (pthread_cond_t * cond, #ifdef _MSC_VER #pragma inline_depth(0) #endif - pthread_cleanup_push(ptw32_cond_wait_cleanup, (void *) &cleanup_args); + pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) &cleanup_args); /* * Now we can release 'mutex' and... */ - if ((result = pthread_mutex_unlock(mutex)) == 0) + if ((result = pthread_mutex_unlock (mutex)) == 0) { /* @@ -433,10 +434,10 @@ ptw32_cond_timedwait (pthread_cond_t * cond, * re-lock the mutex and adjust (to)unblock(ed) waiters * counts if we are cancelled, timed out or signalled. */ - if (sem_timedwait(&(cv->semBlockQueue), abstime) != 0) - { - result = errno; - } + if (sem_timedwait (&(cv->semBlockQueue), abstime) != 0) + { + result = errno; + } } /* @@ -447,7 +448,7 @@ ptw32_cond_timedwait (pthread_cond_t * cond, /* * Always cleanup */ - pthread_cleanup_pop(1); + pthread_cleanup_pop (1); #ifdef _MSC_VER #pragma inline_depth() #endif @@ -457,12 +458,11 @@ ptw32_cond_timedwait (pthread_cond_t * cond, */ return result; -} /* ptw32_cond_timedwait */ +} /* ptw32_cond_timedwait */ int -pthread_cond_wait (pthread_cond_t * cond, - pthread_mutex_t * mutex) +pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex) /* * ------------------------------------------------------ * DOCPUBLIC @@ -514,15 +514,15 @@ pthread_cond_wait (pthread_cond_t * cond, /* * The NULL abstime arg means INFINITE waiting. */ - return (ptw32_cond_timedwait(cond, mutex, NULL)); + return (ptw32_cond_timedwait (cond, mutex, NULL)); -} /* pthread_cond_wait */ +} /* pthread_cond_wait */ int -pthread_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime) +pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime) /* * ------------------------------------------------------ * DOCPUBLIC @@ -573,6 +573,6 @@ pthread_cond_timedwait (pthread_cond_t * cond, return EINVAL; } - return (ptw32_cond_timedwait(cond, mutex, abstime)); + return (ptw32_cond_timedwait (cond, mutex, abstime)); -} /* pthread_cond_timedwait */ +} /* pthread_cond_timedwait */ @@ -139,15 +139,15 @@ extern "C" { #endif /* __cplusplus */ -PTW32_DLLPORT int sched_yield (void); +PTW32_DLLPORT int __cdecl sched_yield (void); -PTW32_DLLPORT int sched_get_priority_min (int policy); +PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy); -PTW32_DLLPORT int sched_get_priority_max (int policy); +PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy); -PTW32_DLLPORT int sched_setscheduler (pid_t pid, int policy); +PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy); -PTW32_DLLPORT int sched_getscheduler (pid_t pid); +PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid); /* * Note that this macro returns ENOTSUP rather than diff --git a/semaphore.h b/semaphore.h index 73bc45d..f26417e 100644 --- a/semaphore.h +++ b/semaphore.h @@ -123,34 +123,34 @@ typedef unsigned int mode_t; typedef struct sem_t_ * sem_t; -PTW32_DLLPORT int sem_init (sem_t * sem, +PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, int pshared, unsigned int value); -PTW32_DLLPORT int sem_destroy (sem_t * sem); +PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); -PTW32_DLLPORT int sem_trywait (sem_t * sem); +PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); -PTW32_DLLPORT int sem_wait (sem_t * sem); +PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); -PTW32_DLLPORT int sem_timedwait (sem_t * sem, +PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, const struct timespec * abstime); -PTW32_DLLPORT int sem_post (sem_t * sem); +PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); -PTW32_DLLPORT int sem_post_multiple (sem_t * sem, +PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, int count); -PTW32_DLLPORT int sem_open (const char * name, +PTW32_DLLPORT int __cdecl sem_open (const char * name, int oflag, mode_t mode, unsigned int value); -PTW32_DLLPORT int sem_close (sem_t * sem); +PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); -PTW32_DLLPORT int sem_unlink (const char * name); +PTW32_DLLPORT int __cdecl sem_unlink (const char * name); -PTW32_DLLPORT int sem_getvalue (sem_t * sem, +PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, int * sval); #ifdef __cplusplus |