* cygwin.din (pthread_spin_destroy): Export.
(pthread_spin_init): Export. (pthread_spin_lock): Export. (pthread_spin_trylock): Export. (pthread_spin_unlock): Export. * posix.sgml (std-susv4): Add pthread_spin_destroy, pthread_spin_init, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock. (std-notimpl): Remove pthread_spin_[...]. * pthread.cc (pthread_spin_init): New function. * thread.cc (pthread_spinlock::is_good_object): New function. (pthread_mutex::pthread_mutex): Rearrange initializers to accommodate protected data in pthread_mutex. (pthread_spinlock::pthread_spinlock): New constructor. (pthread_spinlock::lock): New method. (pthread_spinlock::unlock): New method. (pthread_spinlock::init): New method. (pthread_spin_lock): New function. (pthread_spin_trylock): New function. (pthread_spin_unlock): New function. (pthread_spin_destroy): New function. * thread.h (PTHREAD_SPINLOCK_MAGIC): Define. (class pthread_mutex): Change access level of members shared with derived classes to protected. (pthread_mutex::set_shared): New protected method. (class pthread_spinlock): New class, derived class of pthread_mutex. * include/pthread.h (pthread_spin_destroy): Declare. (pthread_spin_init): Declare. (pthread_spin_lock): Declare. (pthread_spin_trylock): Declare. (pthread_spin_unlock): Declare. * include/cygwin/types.h (pthread_spinlock_t): New typedef. * include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump.
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
/* thread.h: Locking and threading module definitions
|
||||
|
||||
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007,
|
||||
2008, 2009, 2010 Red Hat, Inc.
|
||||
2008, 2009, 2010, 2011 Red Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
@ -98,6 +98,7 @@ class pinfo;
|
||||
#define PTHREAD_ONCE_MAGIC PTHREAD_MAGIC+8
|
||||
#define PTHREAD_RWLOCK_MAGIC PTHREAD_MAGIC+9
|
||||
#define PTHREAD_RWLOCKATTR_MAGIC PTHREAD_MAGIC+10
|
||||
#define PTHREAD_SPINLOCK_MAGIC PTHREAD_MAGIC+11
|
||||
|
||||
#define MUTEX_OWNER_ANONYMOUS ((pthread_t) -1)
|
||||
|
||||
@ -303,18 +304,15 @@ public:
|
||||
mutexes.for_each (&pthread_mutex::_fixup_after_fork);
|
||||
}
|
||||
|
||||
private:
|
||||
protected:
|
||||
unsigned long lock_counter;
|
||||
HANDLE win32_obj_id;
|
||||
unsigned int recursion_counter;
|
||||
LONG condwaits;
|
||||
pthread_t owner;
|
||||
#ifdef DEBUGGING
|
||||
DWORD tid; /* the thread id of the owner */
|
||||
#endif
|
||||
int type;
|
||||
int pshared;
|
||||
|
||||
void set_shared (int in_shared) { pshared = in_shared; }
|
||||
void set_owner (pthread_t self)
|
||||
{
|
||||
recursion_counter = 1;
|
||||
@ -323,10 +321,17 @@ private:
|
||||
tid = GetCurrentThreadId ();
|
||||
#endif
|
||||
}
|
||||
|
||||
static const pthread_t _new_mutex;
|
||||
static const pthread_t _unlocked_mutex;
|
||||
static const pthread_t _destroyed_mutex;
|
||||
|
||||
private:
|
||||
unsigned int recursion_counter;
|
||||
LONG condwaits;
|
||||
int type;
|
||||
int pshared;
|
||||
|
||||
bool no_owner ();
|
||||
void _fixup_after_fork ();
|
||||
|
||||
@ -335,6 +340,18 @@ private:
|
||||
friend class pthread_cond;
|
||||
};
|
||||
|
||||
class pthread_spinlock: public pthread_mutex
|
||||
{
|
||||
public:
|
||||
static bool is_good_object (pthread_spinlock_t const *);
|
||||
static int init (pthread_spinlock_t *, int);
|
||||
|
||||
int lock ();
|
||||
int unlock ();
|
||||
|
||||
pthread_spinlock (int);
|
||||
};
|
||||
|
||||
#define WAIT_CANCELED (WAIT_OBJECT_0 + 1)
|
||||
#define WAIT_SIGNALED (WAIT_OBJECT_0 + 2)
|
||||
|
||||
|
Reference in New Issue
Block a user