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
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/thread.cc9
-rw-r--r--winsup/cygwin/thread.h14
3 files changed, 21 insertions, 8 deletions
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 <corinna@vinschen.de>
+
+ * 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 <cgf@timesys.com>
* 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)