diff options
| author | rpj <rpj> | 1998-12-22 15:59:24 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 1998-12-22 15:59:24 +0000 | 
| commit | 95aa0a376d93ee021a6c085c71418e9f16513e0a (patch) | |
| tree | f05f436e30d759df3af5cfe9e2cde62e3efa6f1b /implement.h | |
| parent | 4650bcf1f1efd88a0c8f502c28945bfabd7ef6db (diff) | |
Sun Dec 20 14:51:58 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
        * misc.c (pthreadCancelableWait): New function by John Bossom. Non-stand
ard
        but provides a hook that can be used to implement cancellation points in
        applications that use this library.
        * pthread.h (pthread_cleanup_pop): C++ (non-WIN32) version uses
        try/catch to emulate John Bossom's WIN32 __try/__finally behaviour.
        In the WIN32 version __finally block, add a test for AbnormalTermination
 otherwise
        cleanup is only run if the cleanup_pop execute arg is non-zero. Cancella
tion
        should cause the cleanup to run irrespective of the execute arg.
        * condvar.c (pthread_condattr_init): Replaced by John Bossom's version.
        (pthread_condattr_destroy): Replaced by John Bossom's version.
        (pthread_condattr_getpshared): Replaced by John Bossom's version.
        (pthread_condattr_setpshared): Replaced by John Bossom's version.
        (pthread_cond_init): Replaced by John Bossom's version.
        Fix comment (refered to mutex rather than condition variable).
        (pthread_cond_destroy): Replaced by John Bossom's version.
        (pthread_cond_wait): Replaced by John Bossom's version.
        (pthread_cond_timedwait): Replaced by John Bossom's version.
        (pthread_cond_signal): Replaced by John Bossom's version.
        (pthread_cond_broadcast): Replaced by John Bossom's version.
Thu Dec 17 19:10:46 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
        * tsd.c (pthread_key_create): Replaced by John Bossom's version.
        (pthread_key_delete): Replaced by John Bossom's version.
        (pthread_setspecific): Replaced by John Bossom's version.
        (pthread_getspecific): Replaced by John Bossom's version.
Mon Dec  7 09:44:40 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
        * cancel.c (pthread_setcancelstate): Replaced by John Bossom's version.
        (pthread_setcanceltype): Replaced by John Bossom's version.
        (pthread_testcancel): Replaced by John Bossom's version.
        (pthread_cancel): Replaced by John Bossom's version.
        * exit.c (pthread_exit): Replaced by John Bossom's version.
        * misc.c (pthread_self): Replaced by John Bossom's version.
        (pthread_equal): Replaced by John Bossom's version.
        * sync.c (pthread_detach): Replaced by John Bossom's version.
        (pthread_join): Replaced by John Bossom's version.
        * create.c (pthread_create): Replaced by John Bossom's version.
        * private.c (_pthread_processInitialize): New by John Bossom.
        (_pthread_processTerminate): Non-public function by John Bossom.
        (_pthread_threadStart): Non-public function by John Bossom.
        (_pthread_threadDestroy): Non-public function by John Bossom.
        (_pthread_cleanupStack): Non-public function by John Bossom.
        (_pthread_tkAssocCreate): Non-public function by John Bossom.
        (_pthread_tkAssocDestroy): Non-public function by John Bossom.
        (_pthread_callUserDestroyRoutines): Non-public function by John Bossom.
        * implement.h: Added John Bossom's non-API structures and
        declarations.
        * dll.c (PthreadsEntryPoint): Cast return value of GetProcAddress
        to resolve compile warning from MSVC.
        * dll.c (DLLmain): Replaced by John Bossom's version.
        * dll.c (PthreadsEntryPoint):
        Re-applied Anders Norlander's patch:-
        Initialize _pthread_try_enter_critical_section at startup
        and release kernel32 handle when DLL is being unloaded.
Diffstat (limited to 'implement.h')
| -rw-r--r-- | implement.h | 273 | 
1 files changed, 272 insertions, 1 deletions
| diff --git a/implement.h b/implement.h index db6b5a2..523f475 100644 --- a/implement.h +++ b/implement.h @@ -1,12 +1,281 @@  /*   * implement.h   * - * Implementation specific (non API) stuff. + * Definitions that don't need to be public. + * + * Keeps all the internals out of pthread.h   */  #ifndef _IMPLEMENT_H  #define _IMPLEMENT_H +/* + * Code contributed by John E. Bossom <JEB>. + */ + +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; +}; + + +struct pthread_attr_t_ { +  void *stackaddr; +  size_t stacksize; +  int detachstate; +}; + + +struct pthread_key_t_ { +  DWORD key; +  void (*destructor) (void *); +  pthread_mutex_t threadsLock; +  void *threads; +}; + + +struct pthread_mutexattr_t_ { +  int pshared; +}; + + +struct pthread_mutex_t_ { +	int valid; +	CRITICAL_SECTION cs; +  }; + + +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; +}; + + +typedef struct ThreadParms ThreadParms; +typedef struct ThreadKeyAssoc ThreadKeyAssoc; + + +struct ThreadParms { +  pthread_t tid; +  void *(*start) (void *); +  void *arg; +}; + + +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. +   * +   * Attributes: +   *      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. +   * +   *      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. +   * +   *      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. +   * +   *      2)      Under WIN32, an association is only created by +   *              pthread_setspecific if the user provided a +   *              destroyRoutine when they created the key. +   * +   * +   */ +  pthread_mutex_t lock; +  pthread_t thread; +  pthread_key_t key; +  ThreadKeyAssoc *nextKey; +  ThreadKeyAssoc *nextThread; +}; + + +/* + * -------------------------------------------------------------- + * 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 + *  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            | + *  +---+-+-+-----------------------+-------------------------------+ + * + * Severity Values: + */ +#define SE_SUCCESS              0x00 +#define SE_INFORMATION	        0x01 +#define SE_WARNING              0x10 +#define SE_ERROR                0x11 + +#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	*/ \ +	    ) ) + +/* + * We choose one specific Facility/Error code combination to + * identify our software exceptions vs. WIN32 exceptions. + * We store our actual component and error code within + * the optional information array. + */ +#define EXCEPTION_PTHREAD_SERVICES	\ +     MAKE_SOFTWARE_EXCEPTION( SE_ERROR, \ +			      PTHREAD_SERVICES_FACILITY, \ +			      PTHREAD_SERVICES_ERROR ) + + +#define PTHREAD_SERVICES_FACILITY		0xBAD +#define PTHREAD_SERVICES_ERROR			0xDEED + + +/* Function pointer to TryEnterCriticalSection if it exists; otherwise NULL */ +extern BOOL (WINAPI *_pthread_try_enter_critical_section)(LPCRITICAL_SECTION); + +/* Declared in global.c */ +extern int _pthread_processInitialized; +extern pthread_key_t _pthread_selfThreadKey; +extern pthread_key_t _pthread_cleanupKey; + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * ===================== + * ===================== + * Forward Declarations + * ===================== + * ===================== + */ +int _pthread_processInitialize (void); + +void _pthread_processTerminate (void); + +void _pthread_threadDestroy (pthread_t tid); + +void _pthread_cleanupStack (void); + +void *_pthread_threadStart (ThreadParms * threadParms); + +void _pthread_callUserDestroyRoutines (pthread_t thread); + +int _pthread_tkAssocCreate (ThreadKeyAssoc ** assocP, +			    pthread_t thread, +			    pthread_key_t key); + +void _pthread_tkAssocDestroy (ThreadKeyAssoc * assoc); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* </JEB> */ + + +#if 0 /* Pre Bossom */ +  /* Use internally to initialise const ints and thread admin array sizes. */  #define _PTHREAD_MAX_THREADS 128  #define _PTHREAD_MAX_KEYS 128 @@ -194,4 +463,6 @@ extern pthread_key_t _pthread_key_reuse[];  /* Index to the first available reusable pthread_key_t. */  extern int _pthread_key_reuse_top; +#endif /* Pre Bossom */ +  #endif /* _IMPLEMENT_H */ | 
