* configure.in: Remove PTH_ALLOW.
* cygwin.din: Remove @PTH_ALLOW@ prefixes to pthread functions. Add new pthread exports. * pthread.cc: New wrapper functions for the above new exports. * sched.cc (valid_sched_parameters): New function. (sched_setparam): Use it. (sched_set_thread_priority): New function. Used by pthread_sched*. * thread.cc (pthread_key_destructor::InsertAfter): New function. (pthread_key_destructor::UnlinkNext): New function. (pthread_key_destructor::Next): New function. (pthread_key_destructor_list::Insert): New function. (pthread_key_destructor_list::Remove): New function. (pthread_key_destructor_list::Pop): New function. (pthread_key_destructor::pthread_key_destructor): New function. (pthread_key_destructor_list::IterateNull): New function. (MTinterface::Init): Initialise new member. (pthread::pthread): Initialise new members. (pthread::create): Copy new attributes. Set the new thread priority. (pthread_attr::pthread_attr): Initialise new members. (pthread_key::pthread_key): Setup destructor function. (pthread_key::~pthread_key): Remove destructor function. (pthread_mutexattr::pthread_mutexattr): New function. (pthread_mutexattr::~pthread_mutexattr): New function. (__pthread_once): New function. (__pthread_cleanup): New function. (__pthread_cancel): New function. (__pthread_setcancelstate): New function. (__pthread_setcanceltype): New function. (__pthread_testcancel): New function. (__pthread_attr_getinheritsched): New function. (__pthread_attr_getschedparam): New function. (__pthread_attr_getschedpolicy): New function. (__pthread_attr_getscope): New function. (__pthread_attr_setinheritsched): New function. (__pthread_attr_setschedparam): New function. (__pthread_attr_setschedpolicy): New function. (__pthread_attr_setscope): New function. (__pthread_exit): Call any key destructors on thread exit. (__pthread_join): Use the embedded attr values. (__pthread_detach): Use the embedded attr values. (__pthread_getconcurrency): New function. (__pthread_getschedparam): New function. (__pthread_key_create): Pass the destructor on object creation. (__pthread_key_delete): Correct incorrect prototype. (__pthread_setconcurrency): New function. (__pthread_setschedparam): New function. (__pthread_cond_timedwait): Support static mutex initialisers. (__pthread_cond_wait): Ditto. (__pthread_mutex_getprioceiling): New function. (__pthread_mutex_lock): Support static mutex initialisers. (__pthread_mutex_trylock): Ditto. (__pthread_mutex_unlock): Ditto. (__pthread_mutex_destroy): Ditto. (__pthread_mutex_setprioceiling): New function. (__pthread_mutexattr_getprotocol): New function. (__pthread_mutexattr_getpshared): New function. (__pthread_mutexattr_gettype): New function. (__pthread_mutexattr_init): New function. (__pthread_mutexattr_destroy): New function. (__pthread_mutexattr_setprotocol): New function. (__pthread_mutexattr_setprioceiling): New function. (__pthread_mutexattr_getprioceiling): New function. (__pthread_mutexattr_setpshared): New function. (__pthread_mutexattr_settype): New function. Remove stubs for non MT_SAFE compilation. * thread.h: Remove duplicate #defines. Add prototypes for new functions in thread.cc. (pthread_key_destructor): New class. (pthread_key_destructor_list): New class. (pthread_attr): Add new members. (pthread): Remove members that are duplicated in the pthread_attr class. (pthread_mutex_attr): Add new members. (pthread_once): New class. * include/pthread.h: Add prototypes for new functions exported from cygwin1.dll. Remove typedefs. * include/sched.h: Add prototypes for new functions in sched.cc. * include/cygwin/types.h: Add typedefs from pthread.h
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user