From 0749394433f301cccd22d280cee1dd760b72e876 Mon Sep 17 00:00:00 2001 From: rpj Date: Mon, 28 Dec 1998 23:01:00 +0000 Subject: With this update I'm able to build the library and build and run the tsd1.c test successfully using buildlib.bat and build.bat scripts. I not convinced that I understand the relationships between "__cplusplus" and "_WIN32" and the MS compiler, particularly in pthread.h where pthread_cleanup_push etc is defined. In particular, I have assumed that the __try/__finally blocks are only available if _WIN32 and __cplusplus are defined. I suspect this is wrong. Tue Dec 29 13:11:16 1998 Ross Johnson * implement.h: Move the following struct definitions to pthread.h: pthread_t_, pthread_attr_t_, pthread_mutex_t_, pthread_mutex_t_, pthread_mutexattr_t_, pthread_key_t_, pthread_cond_t_, pthread_condattr_t_, pthread_once_t_. * pthread.h: Add "_" prefix to pthread_push_cleanup and pthread_pop_cleanup internal routines, and associated struct and typedefs. * buildlib.bat: Add compile command for semaphore.c * pthread.def: Comment out pthread_atfork routine name. Now unimplemented. * tsd.c (pthread_setspecific): Rename tkAssocCreate to _pthread_tkAssocCreate. (pthread_key_delete): Rename tkAssocDestroy to _pthread_tkAssocDestroy. * sync.c (pthread_join): Rename threadDestroy to _pthread_threadDestroy * sched.c (is_attr): attr is now **attr (was *attr), so add extra NULL pointer test. (pthread_attr_setschedparam): Increase redirection for attr which is now a **. (pthread_attr_getschedparam): Ditto. (pthread_setschedparam): Change thread validation and rename "thread" Win32 thread Handle element name to match John Bossom's version. (pthread_getschedparam): Ditto. * private.c (_pthread_threadDestroy): Rename call to callUserDestroyRoutines() as _pthread_callUserDestroyRoutines() * misc.c: Add #include "implement.h". * dll.c: Remove defined(KLUDGE) wrapped code. * fork.c: Remove redefinition of ENOMEM. Remove pthread_atfork() and fork() with #if 0/#endif. * create.c (pthread_create): Rename threadStart and threadDestroy calls to _pthread_threadStart and _pthread_threadDestroy. * implement.h: Rename "detachedstate" to "detachstate". * attr.c: Rename "detachedstate" to "detachstate". Mon Dec 28 09:54:39 1998 Ross Johnson * pthread.h (pthread_attr_t_): Change to *pthread_attr_t. * attr.c (pthread_attr_setstacksize): Merge with John Bossom's version. (pthread_attr_getstacksize): Merge with John Bossom's version. (pthread_attr_setstackaddr): Merge with John Bossom's version. (pthread_attr_getstackaddr): Merge with John Bossom's version. (pthread_attr_init): Merge with John Bossom's version. (pthread_attr_destroy): Merge with John Bossom's version. (pthread_attr_getdetachstate): Merge with John Bossom's version. (pthread_attr_setdetachstate): Merge with John Bossom's version. (is_attr): attr is now **attr (was *attr), so add extra NULL pointer test. * implement.h (pthread_attr_t_): Add and rename elements in JEB's version to correspond to original, so that it can be used with original attr routines. * pthread.h: Add #endif at end which was truncated in merging. --- pthread.h | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 17 deletions(-) (limited to 'pthread.h') diff --git a/pthread.h b/pthread.h index 458ef6e..dfde977 100644 --- a/pthread.h +++ b/pthread.h @@ -234,7 +234,7 @@ struct timespec { #include -#include +/* #include /**/ #ifdef __cplusplus @@ -397,7 +397,7 @@ extern "C" typedef struct pthread_t_ *pthread_t; - typedef struct pthread_attr_t_ pthread_attr_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; @@ -480,6 +480,126 @@ extern "C" #define PTHREAD_COND_INITIALIZER { {0, 0}, 0, PTHREAD_MUTEX_INITIALIZER } +/* + * ==================== + * ==================== + * Opaque Structure Definitions + * ==================== + * ==================== + */ + +typedef enum { + /* + * This enumeration represents the state of the thread; + * 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 and is */ + /* in the process of terminating */ + /* due to a cancellation request */ + PThreadStateException, /* Thread alive but exiting */ + /* due to an exception */ + PThreadStateLast +} +PThreadState; + + +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! */ +} +PThreadDemise; + + +struct pthread_t_ { + DWORD thread; + HANDLE threadH; + PThreadState state; + PThreadDemise demise; + void *exitStatus; + void *parms; + int detachState; + int cancelState; + int cancelType; + HANDLE cancelEvent; + int implicit:1; + void *keys; +}; + + +/* + * Special value to mark attribute objects as valid. + */ +#define _PTHREAD_ATTR_VALID 0xC4C0FFEE + +struct pthread_attr_t_ { + long valid; + void *stackaddr; + size_t stacksize; + int detachstate; + int priority; +#if HAVE_SIGSET_T + sigset_t sigmask; +#endif /* HAVE_SIGSET_T */ +}; + + +struct pthread_mutex_t_ { + int valid; + CRITICAL_SECTION cs; + }; + + +struct pthread_mutexattr_t_ { + int pshared; +}; + + +struct pthread_key_t_ { + DWORD key; + void (*destructor) (void *); + pthread_mutex_t threadsLock; + void *threads; +}; + + +struct pthread_cond_t_ { + long waiters; /* # waiting threads */ + pthread_mutex_t waitersLock; /* Mutex that guards access to + waiter count */ + sem_t sema; /* Queue up threads waiting for the + condition to become signaled */ + HANDLE waitersDone; /* An auto reset event used by the + broadcast/signal thread to wait + for the waiting thread(s) to wake + up and get a chance at the + semaphore */ + int wasBroadcast; /* keeps track if we are signaling + or broadcasting */ +}; + + +struct pthread_condattr_t_ { + int pshared; +}; + + +struct pthread_once_t_ { + unsigned short flag; + pthread_mutex_t lock; +}; + + /* * ==================== * ==================== @@ -510,28 +630,31 @@ extern "C" * WIN32 SEH or C++ */ -#ifndef __cplusplus + typedef struct _pthread_cleanup_t _pthread_cleanup_t; -/* - * C implementation of PThreads cancel cleanup - */ - typedef struct pthread_cleanup_t pthread_cleanup_t; - - struct pthread_cleanup_t + struct _pthread_cleanup_t { void (*routine) (void *); void *arg; - pthread_cleanup_t *prev; +#if !defined(__cplusplus) + _pthread_cleanup_t *prev; +#endif }; +#ifndef __cplusplus + +/* + * C implementation of PThreads cancel cleanup + */ + #define pthread_cleanup_push( _rout, _arg ) \ { \ - pthread_cleanup_t cleanup; \ + _pthread_cleanup_t _cleanup; \ \ - pthread_push_cleanup( &cleanup, (_rout), (_arg) ); \ + _pthread_push_cleanup( &_cleanup, (_rout), (_arg) ); \ #define pthread_cleanup_pop( _execute ) \ - (void) pthread_pop_cleanup( _execute ); \ + (void) _pthread_pop_cleanup( _execute ); \ } #else /* !__cplusplus */ @@ -543,7 +666,7 @@ extern "C" #define pthread_cleanup_push( _rout, _arg ) \ { \ - pthread_cleanup_t _cleanup; \ + _pthread_cleanup_t _cleanup; \ \ _cleanup.routine = (_rout); \ _cleanup.arg = (_arg); \ @@ -571,7 +694,7 @@ extern "C" #define pthread_cleanup_push( _rout, _arg ) \ { \ - pthread_cleanup_t _cleanup; \ + _pthread_cleanup_t _cleanup; \ \ _cleanup.routine = (_rout); \ _cleanup.arg = (_arg); \ @@ -652,11 +775,13 @@ pthread_t pthread_self (void); int pthread_cancel (pthread_t thread); -pthread_cleanup_t *pthread_pop_cleanup (int execute); +#ifndef __cplusplus +_pthread_cleanup_t *_pthread_pop_cleanup (int execute); -void pthread_push_cleanup (pthread_cleanup_t * cleanup, +void _pthread_push_cleanup (_pthread_cleanup_t * cleanup, void (*routine) (void *), void *arg); +#endif /* !__cplusplus */ int pthread_setcancelstate (int state, int *oldstate); @@ -817,3 +942,4 @@ int pthreadCancelableWait (HANDLE waitHandle); } /* End of extern "C" */ #endif /* __cplusplus */ +#endif /* PTHREAD_H */ -- cgit v1.2.3