diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 79e62e8e7..d5ffcecf8 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2005-09-06 Corinna Vinschen + + * thread.h: Revert patch from 2005-09-05. + * thread.cc (pthread_mutex::can_be_unlocked): Return true also if + mutex is owned by MUTEX_OWNER_ANONYMOUS. + 2005-09-05 Christopher Faylor * cygheap.cc (cygheap_init): Eliminate debugging #if. diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 9f4899e91..11d60fc0e 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -212,10 +212,11 @@ pthread_mutex::can_be_unlocked (pthread_mutex_t const *mutex) if (!is_good_object (mutex)) return false; - /* - * Check if the mutex is owned by the current thread and can be unlocked - */ - return ((*mutex)->recursion_counter == 1 && pthread::equal ((*mutex)->owner, self)); + /* Check if the mutex is owned by the current thread and can be unlocked. + * Also check for the ANONYMOUS owner to cover NORMAL mutexes as well. */ + return ((*mutex)->recursion_counter == 1 + && ((*mutex)->owner == MUTEX_OWNER_ANONYMOUS + || pthread::equal ((*mutex)->owner, self))); } inline bool diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index f8ab9da8b..c15ded478 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -301,21 +301,27 @@ public: int type; int pshared; + pthread_t get_pthread_self () const + { + return PTHREAD_MUTEX_NORMAL == type ? MUTEX_OWNER_ANONYMOUS : + ::pthread_self (); + } + int lock () { - return _lock (::pthread_self ()); + return _lock (get_pthread_self ()); } int trylock () { - return _trylock (::pthread_self ()); + return _trylock (get_pthread_self ()); } int unlock () { - return _unlock (::pthread_self ()); + return _unlock (get_pthread_self ()); } int destroy () { - return _destroy (::pthread_self ()); + return _destroy (get_pthread_self ()); } void set_owner (pthread_t self)