Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/thread.h')
-rw-r--r--winsup/cygwin/thread.h301
1 files changed, 187 insertions, 114 deletions
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index deeef50f5..00c10b298 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -26,7 +26,7 @@ details. */
extern "C"
{
#if defined (_CYG_THREAD_FAILSAFE) && defined (_MT_SAFE)
-void AssertResourceOwner (int, int);
+ void AssertResourceOwner (int, int);
#else
#define AssertResourceOwner(i,ii)
#endif
@@ -39,21 +39,7 @@ void AssertResourceOwner (int, int);
#else
-//#include <pthread.h>
-/* FIXME: these are defined in pthread.h, but pthread.h defines symbols it shouldn't -
- * all the types.
- */
-#define PTHREAD_PROCESS_PRIVATE 0
-#define PTHREAD_PROCESS_SHARED 1
-#define PTHREAD_DESTRUCTOR_ITERATIONS 1
-/* Tls has 64 items for pre win2000 - and we don't want to use them all :]
- * Before committing discuss this with the list
- */
-#define PTHREAD_KEYS_MAX 32
-#define PTHREAD_CREATE_DETACHED 1
-/* the default : joinable */
-#define PTHREAD_CREATE_JOINABLE 0
-
+#include <pthread.h>
#include <signal.h>
#include <pwd.h>
#include <grp.h>
@@ -66,8 +52,8 @@ extern "C"
struct _winsup_t
{
/*
- Needed for the group functions
- */
+ Needed for the group functions
+ */
struct group _grp;
char *_namearray[2];
int _grp_pos;
@@ -136,7 +122,9 @@ class pinfo;
class ResourceLocks
{
public:
- ResourceLocks () {}
+ ResourceLocks ()
+ {
+ }
LPCRITICAL_SECTION Lock (int);
void Init ();
void Delete ();
@@ -157,26 +145,74 @@ private:
#define PTHREAD_COND_MAGIC PTHREAD_MAGIC+5
#define PTHREAD_CONDATTR_MAGIC PTHREAD_MAGIC+6
#define SEM_MAGIC PTHREAD_MAGIC+7
+#define PTHREAD_ONCE_MAGIC PTHREAD_MAGIC+8;
+
+/* verifyable_object should not be defined here - it's a general purpose class */
class verifyable_object
{
public:
long magic;
- verifyable_object (long);
- ~verifyable_object ();
+ verifyable_object (long);
+ ~verifyable_object ();
};
int verifyable_object_isvalid (verifyable_object *, long);
+class pthread_key:public verifyable_object
+{
+public:
+
+ DWORD dwTlsIndex;
+ int set (const void *);
+ void *get ();
+
+ pthread_key (void (*)(void *));
+ ~pthread_key ();
+};
+
+/* FIXME: test using multiple inheritance and merging key_destructor into pthread_key
+ * for efficiency */
+class pthread_key_destructor
+{
+public:
+ void (*destructor) (void *);
+ pthread_key_destructor *InsertAfter (pthread_key_destructor * node);
+ pthread_key_destructor *UnlinkNext ();
+ pthread_key_destructor *Next ();
+
+ pthread_key_destructor (void (*thedestructor) (void *), pthread_key * key);
+ pthread_key_destructor *next;
+ pthread_key *key;
+};
+
+class pthread_key_destructor_list
+{
+public:
+ void Insert (pthread_key_destructor * node);
+/* remove a given dataitem, wherever in the list it is */
+ pthread_key_destructor *Remove (pthread_key_destructor * item);
+/* get the first item and remove at the same time */
+ pthread_key_destructor *Pop ();
+ pthread_key_destructor *Remove (pthread_key * key);
+ void IterateNull ();
+private:
+ pthread_key_destructor * head;
+};
+
+
class pthread_attr:public verifyable_object
{
public:
int joinable;
+ int contentionscope;
+ int inheritsched;
+ struct sched_param schedparam;
size_t stacksize;
- pthread_attr ();
- ~pthread_attr ();
+ pthread_attr ();
+ ~pthread_attr ();
};
class pthread:public verifyable_object
@@ -188,7 +224,9 @@ public:
void *arg;
void *return_ptr;
bool suspended;
- int joinable;
+ int cancelstate, canceltype;
+ // int joinable;
+
DWORD GetThreadId ()
{
return thread_id;
@@ -204,18 +242,20 @@ public:
LONG *sigtodo;
void create (void *(*)(void *), pthread_attr *, void *);
- pthread ();
- ~pthread ();
+ pthread ();
+ ~pthread ();
private:
- DWORD thread_id;
+ DWORD thread_id;
};
class pthread_mutexattr:public verifyable_object
{
public:
- pthread_mutexattr ();
- ~pthread_mutexattr ();
+ int pshared;
+ int mutextype;
+ pthread_mutexattr ();
+ ~pthread_mutexattr ();
};
class pthread_mutex:public verifyable_object
@@ -228,20 +268,8 @@ public:
int TryLock ();
int UnLock ();
- pthread_mutex (pthread_mutexattr *);
- ~pthread_mutex ();
-};
-
-class pthread_key:public verifyable_object
-{
-public:
-
- DWORD dwTlsIndex;
- int set (const void *);
- void *get ();
-
- pthread_key ();
- ~pthread_key ();
+ pthread_mutex (pthread_mutexattr *);
+ ~pthread_mutex ();
};
class pthread_condattr:public verifyable_object
@@ -249,8 +277,8 @@ class pthread_condattr:public verifyable_object
public:
int shared;
- pthread_condattr ();
- ~pthread_condattr ();
+ pthread_condattr ();
+ ~pthread_condattr ();
};
class pthread_cond:public verifyable_object
@@ -264,8 +292,15 @@ public:
void BroadCast ();
void Signal ();
- pthread_cond (pthread_condattr *);
- ~pthread_cond ();
+ pthread_cond (pthread_condattr *);
+ ~pthread_cond ();
+};
+
+class pthread_once
+{
+public:
+ pthread_mutex_t mutex;
+ int state;
};
/* shouldn't be here */
@@ -278,21 +313,10 @@ public:
void Post ();
int TryWait ();
- semaphore (int, unsigned int);
- ~semaphore ();
+ semaphore (int, unsigned int);
+ ~semaphore ();
};
-typedef class pthread *pthread_t;
-typedef class pthread_mutex *pthread_mutex_t;
-/* sem routines belong in semaphore.cc */
-typedef class semaphore *sem_t;
-
-typedef class pthread_key *pthread_key_t;
-typedef class pthread_attr *pthread_attr_t;
-typedef class pthread_mutexattr *pthread_mutexattr_t;
-typedef class pthread_condattr *pthread_condattr_t;
-typedef class pthread_cond *pthread_cond_t;
-
class MTinterface
{
public:
@@ -301,94 +325,143 @@ public:
DWORD thread_self_dwTlsIndex;
/* we may get 0 for the Tls index.. grrr */
int indexallocated;
+ int concurrency;
// Used for main thread data, and sigproc thread
struct __reent_t reents;
struct _winsup_t winsup_reent;
pthread mainthread;
+ pthread_key_destructor_list destructors;
+
void Init (int);
- MTinterface ():reent_index (0), indexallocated (0)
- {}
+ MTinterface ():reent_index (0), indexallocated (0)
+ {
+ }
};
extern "C"
{
- void *thread_init_wrapper (void *);
+void *thread_init_wrapper (void *);
/* ThreadCreation */
- int __pthread_create (pthread_t * thread, const pthread_attr_t * attr,
- void *(*start_routine) (void *), void *arg);
- int __pthread_attr_init (pthread_attr_t * attr);
- int __pthread_attr_destroy (pthread_attr_t * attr);
- int __pthread_attr_setdetachstate (pthread_attr_t *, int);
- int __pthread_attr_getdetachstate (const pthread_attr_t *, int *);
- int __pthread_attr_setstacksize (pthread_attr_t * attr, size_t size);
- int __pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size);
-/*
-__pthread_attr_setstackaddr(...);
-__pthread_attr_getstackaddr(...);
-*/
+int __pthread_create (pthread_t * thread, const pthread_attr_t * attr,
+ void *(*start_routine) (void *), void *arg);
+int __pthread_once (pthread_once_t *, void (*)(void));
+
+int __pthread_attr_init (pthread_attr_t * attr);
+int __pthread_attr_destroy (pthread_attr_t * attr);
+int __pthread_attr_setdetachstate (pthread_attr_t *, int);
+int __pthread_attr_getdetachstate (const pthread_attr_t *, int *);
+int __pthread_attr_setstacksize (pthread_attr_t * attr, size_t size);
+int __pthread_attr_getstacksize (const pthread_attr_t * attr, size_t * size);
+
+int __pthread_attr_getinheritsched (const pthread_attr_t *, int *);
+int __pthread_attr_getschedparam (const pthread_attr_t *,
+ struct sched_param *);
+int __pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
+int __pthread_attr_getscope (const pthread_attr_t *, int *);
+int __pthread_attr_getstackaddr (const pthread_attr_t *, void **);
+int __pthread_attr_setinheritsched (pthread_attr_t *, int);
+int __pthread_attr_setschedparam (pthread_attr_t *,
+ const struct sched_param *);
+int __pthread_attr_setschedpolicy (pthread_attr_t *, int);
+int __pthread_attr_setscope (pthread_attr_t *, int);
+int __pthread_attr_setstackaddr (pthread_attr_t *, void *);
+
+
/* Thread Exit */
- void __pthread_exit (void *value_ptr);
- int __pthread_join (pthread_t * thread, void **return_val);
- int __pthread_detach (pthread_t * thread);
+void __pthread_exit (void *value_ptr);
+int __pthread_join (pthread_t * thread, void **return_val);
+int __pthread_detach (pthread_t * thread);
/* Thread suspend */
- int __pthread_suspend (pthread_t * thread);
- int __pthread_continue (pthread_t * thread);
+int __pthread_suspend (pthread_t * thread);
+int __pthread_continue (pthread_t * thread);
- unsigned long __pthread_getsequence_np (pthread_t * thread);
+unsigned long __pthread_getsequence_np (pthread_t * thread);
/* Thread SpecificData */
- int __pthread_key_create (pthread_key_t * key, void (*destructor) (void *));
- int __pthread_key_delete (pthread_key_t * key);
- int __pthread_setspecific (pthread_key_t key, const void *value);
- void *__pthread_getspecific (pthread_key_t key);
+int __pthread_key_create (pthread_key_t * key, void (*destructor) (void *));
+int __pthread_key_delete (pthread_key_t key);
+int __pthread_setspecific (pthread_key_t key, const void *value);
+void *__pthread_getspecific (pthread_key_t key);
/* Thead synchroniation */
- int __pthread_cond_destroy (pthread_cond_t * cond);
- int __pthread_cond_init (pthread_cond_t * cond,
- const pthread_condattr_t * attr);
- int __pthread_cond_signal (pthread_cond_t * cond);
- int __pthread_cond_broadcast (pthread_cond_t * cond);
- int __pthread_cond_timedwait (pthread_cond_t * cond,
- pthread_mutex_t * mutex,
- const struct timespec *abstime);
- int __pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex);
- int __pthread_condattr_init (pthread_condattr_t * condattr);
- int __pthread_condattr_destroy (pthread_condattr_t * condattr);
- int __pthread_condattr_getpshared (const pthread_condattr_t * attr,
- int *pshared);
- int __pthread_condattr_setpshared (pthread_condattr_t * attr, int pshared);
+int __pthread_cond_destroy (pthread_cond_t * cond);
+int __pthread_cond_init (pthread_cond_t * cond,
+ const pthread_condattr_t * attr);
+int __pthread_cond_signal (pthread_cond_t * cond);
+int __pthread_cond_broadcast (pthread_cond_t * cond);
+int __pthread_cond_timedwait (pthread_cond_t * cond,
+ pthread_mutex_t * mutex,
+ const struct timespec *abstime);
+int __pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex);
+int __pthread_condattr_init (pthread_condattr_t * condattr);
+int __pthread_condattr_destroy (pthread_condattr_t * condattr);
+int __pthread_condattr_getpshared (const pthread_condattr_t * attr,
+ int *pshared);
+int __pthread_condattr_setpshared (pthread_condattr_t * attr, int pshared);
/* Thread signal */
- int __pthread_kill (pthread_t * thread, int sig);
- int __pthread_sigmask (int operation, const sigset_t * set,
- sigset_t * old_set);
+int __pthread_kill (pthread_t thread, int sig);
+int __pthread_sigmask (int operation, const sigset_t * set,
+ sigset_t * old_set);
/* ID */
- pthread_t __pthread_self ();
- int __pthread_equal (pthread_t * t1, pthread_t * t2);
+pthread_t __pthread_self ();
+int __pthread_equal (pthread_t * t1, pthread_t * t2);
/* Mutexes */
- int __pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
- int __pthread_mutex_lock (pthread_mutex_t *);
- int __pthread_mutex_trylock (pthread_mutex_t *);
- int __pthread_mutex_unlock (pthread_mutex_t *);
- int __pthread_mutex_destroy (pthread_mutex_t *);
+int __pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+int __pthread_mutex_lock (pthread_mutex_t *);
+int __pthread_mutex_trylock (pthread_mutex_t *);
+int __pthread_mutex_unlock (pthread_mutex_t *);
+int __pthread_mutex_destroy (pthread_mutex_t *);
+int __pthread_mutex_setprioceiling (pthread_mutex_t * mutex,
+ int prioceiling, int *old_ceiling);
+int __pthread_mutex_getprioceiling (const pthread_mutex_t * mutex,
+ int *prioceiling);
+
+
+int __pthread_mutexattr_destroy (pthread_mutexattr_t *);
+int __pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *, int *);
+int __pthread_mutexattr_getprotocol (const pthread_mutexattr_t *, int *);
+int __pthread_mutexattr_getpshared (const pthread_mutexattr_t *, int *);
+int __pthread_mutexattr_gettype (const pthread_mutexattr_t *, int *);
+int __pthread_mutexattr_init (pthread_mutexattr_t *);
+int __pthread_mutexattr_setprioceiling (pthread_mutexattr_t *, int);
+int __pthread_mutexattr_setprotocol (pthread_mutexattr_t *, int);
+int __pthread_mutexattr_setpshared (pthread_mutexattr_t *, int);
+int __pthread_mutexattr_settype (pthread_mutexattr_t *, int);
+
+
+/* Scheduling */
+int __pthread_getconcurrency (void);
+int __pthread_setconcurrency (int new_level);
+int __pthread_getschedparam (pthread_t thread, int *policy,
+ struct sched_param *param);
+int __pthread_setschedparam (pthread_t thread, int policy,
+ const struct sched_param *param);
+
+/* cancelability states */
+int __pthread_cancel (pthread_t thread);
+int __pthread_setcancelstate (int state, int *oldstate);
+int __pthread_setcanceltype (int type, int *oldtype);
+void __pthread_testcancel (void);
+
/* Semaphores */
- int __sem_init (sem_t * sem, int pshared, unsigned int value);
- int __sem_destroy (sem_t * sem);
- int __sem_wait (sem_t * sem);
- int __sem_trywait (sem_t * sem);
- int __sem_post (sem_t * sem);
+int __sem_init (sem_t * sem, int pshared, unsigned int value);
+int __sem_destroy (sem_t * sem);
+int __sem_wait (sem_t * sem);
+int __sem_trywait (sem_t * sem);
+int __sem_post (sem_t * sem);
};
#endif // MT_SAFE