summaryrefslogtreecommitdiff
path: root/pthread.h
diff options
context:
space:
mode:
authorrpj <rpj>1998-12-28 23:01:00 +0000
committerrpj <rpj>1998-12-28 23:01:00 +0000
commit0749394433f301cccd22d280cee1dd760b72e876 (patch)
treea5084cfaea800cdc96c25bf71a179562e18c552c /pthread.h
parent95aa0a376d93ee021a6c085c71418e9f16513e0a (diff)
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 <rpj@ixobrychus.canberra.edu.au> * 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 <rpj@ixobrychus.canberra.edu.au> * 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.
Diffstat (limited to 'pthread.h')
-rw-r--r--pthread.h160
1 files changed, 143 insertions, 17 deletions
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 <semaphore.h>
-#include <sched.h>
+/* #include <sched.h> /**/
#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;
@@ -483,6 +483,126 @@ extern "C"
/*
* ====================
* ====================
+ * 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;
+};
+
+
+/*
+ * ====================
+ * ====================
* Scheduling
* ====================
* ====================
@@ -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 */