POSIX barrier implementation, take 3
The attached patch should address all of the review comments. Modifed change log: Newlib: * libc/include/sys/features.h (_POSIX_BARRIERS): Define for Cygwin. * libc/include/sys/types.h (pthread_barrier_t) (pthread_barrierattr_t): Do not define for Cygwin. Cygwin: * common.din (pthread_barrierattr_init) (pthread_barrierattr_setpshared, pthread_barrierattr_getpshared) (pthread_barrierattr_destroy, pthread_barrier_init) (pthread_barrier_destroy, pthread_barrier_wait): Export. * include/cygwin/types.h (pthread_barrierattr_t) (pthread_barrier_t): Declare. * include/pthread.h (PTHREAD_BARRIER_SERIAL_THREAD) (pthread_barrierattr_init, pthread_barrierattr_setpshared) (pthread_barrierattr_getpshared, pthread_barrierattr_destroy) (pthread_barrier_init, pthread_barrier_destroy) (pthread_barrier_wait): Declare. * thread.h (PTHREAD_BARRIER_MAGIC) (PTHREAD_BARRIERATTR_MAGIC): Define. (class pthread_barrierattr, class pthread_barrier): Declare. * thread.cc (delete_and_clear): New local helper function. (class pthread_barrierattr, class pthread_barrier): Implement. * miscfuncs.h (likely, unlikely): New macros. -- VH
This commit is contained in:
committed by
Corinna Vinschen
parent
ef64aa4940
commit
813da84442
@ -1,3 +1,4 @@
|
||||
// -*- C++ -*-
|
||||
/* thread.h: Locking and threading module definitions
|
||||
|
||||
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009,
|
||||
@ -84,6 +85,8 @@ class pinfo;
|
||||
#define PTHREAD_RWLOCK_MAGIC PTHREAD_MAGIC+9
|
||||
#define PTHREAD_RWLOCKATTR_MAGIC PTHREAD_MAGIC+10
|
||||
#define PTHREAD_SPINLOCK_MAGIC PTHREAD_MAGIC+11
|
||||
#define PTHREAD_BARRIER_MAGIC PTHREAD_MAGIC+12
|
||||
#define PTHREAD_BARRIERATTR_MAGIC PTHREAD_MAGIC+13
|
||||
|
||||
#define MUTEX_OWNER_ANONYMOUS ((pthread_t) -1)
|
||||
|
||||
@ -520,6 +523,38 @@ private:
|
||||
static fast_mutex cond_initialization_lock;
|
||||
};
|
||||
|
||||
|
||||
class pthread_barrierattr: public verifyable_object
|
||||
{
|
||||
public:
|
||||
static bool is_good_object(pthread_barrierattr_t const *);
|
||||
int shared;
|
||||
|
||||
pthread_barrierattr ();
|
||||
~pthread_barrierattr ();
|
||||
};
|
||||
|
||||
|
||||
class pthread_barrier: public verifyable_object
|
||||
{
|
||||
public:
|
||||
static bool is_good_object(pthread_barrier_t const *);
|
||||
|
||||
pthread_mutex_t mtx; /* Mutex protecting everything below. */
|
||||
pthread_cond_t cond; /* Conditional variable to wait on. */
|
||||
unsigned cnt; /* Barrier count. Threads to wait for. */
|
||||
uint64_t cyc; /* Cycle count. */
|
||||
unsigned wt; /* Already waiting threads count. */
|
||||
|
||||
int init (const pthread_barrierattr_t *, unsigned);
|
||||
int wait();
|
||||
int destroy ();
|
||||
|
||||
pthread_barrier ();
|
||||
~pthread_barrier ();
|
||||
};
|
||||
|
||||
|
||||
class pthread_rwlockattr: public verifyable_object
|
||||
{
|
||||
public:
|
||||
|
Reference in New Issue
Block a user