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
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hotmail.com>2001-06-22 02:27:20 +0400
committerRobert Collins <rbtcollins@hotmail.com>2001-06-22 02:27:20 +0400
commitb643afa4c7f963743fcb805ce285927dd9be1001 (patch)
treee0d365d919492547c5516a9205cdaf51533b4deb
parent9cc97acbd0a601622de1198d8b56db8be48e12fb (diff)
2001-06-22 Robert Collins rbtcollins@hotmail.com
* thread.cc (__pthread_cond_timedwait): Lock the waiting mutex before the condition protect mutex to avoid deadlocking. (Found by Greg Smith). (__pthread_cond_wait): Ditto.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/thread.cc4
2 files changed, 8 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 86341e03b..4c2a264d6 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2001-06-22 Robert COllins <rbbtcollins@hotmail.com>
+
+ * thread.cc (__pthread_cond_timedwait): Lock the waiting mutex before
+ the condition protect mutex to avoid deadlocking. (Found by Greg Smith).
+ (__pthread_cond_wait): Ditto.
+
2001-06-30 Egor Duda <deo@logos-m.ru>
* fhandler.cc (fhandler_base::open): Work around windows bug when
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 7ab45aeeb..7da2a7588 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -1672,9 +1672,9 @@ __pthread_cond_timedwait (pthread_cond_t * cond, pthread_mutex_t * mutex,
if (pthread_mutex_unlock (&(*cond)->cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond);
rv = (*cond)->TimedWait (abstime->tv_sec * 1000);
+ (*cond)->mutex->Lock ();
if (pthread_mutex_lock (&(*cond)->cond_access))
system_printf ("Failed to lock condition variable access mutex, this %0p\n", *cond);
- (*cond)->mutex->Lock ();
if (InterlockedDecrement (&((*cond)->waiting)) == 0)
(*cond)->mutex = NULL;
InterlockedDecrement (&((*themutex)->condwaits));
@@ -1719,9 +1719,9 @@ __pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex)
if (pthread_mutex_unlock (&(*cond)->cond_access))
system_printf ("Failed to unlock condition variable access mutex, this %0p\n", *cond);
rv = (*cond)->TimedWait (INFINITE);
+ (*cond)->mutex->Lock ();
if (pthread_mutex_lock (&(*cond)->cond_access))
system_printf ("Failed to lock condition variable access mutex, this %0p\n", *cond);
- (*cond)->mutex->Lock ();
if (InterlockedDecrement (&((*cond)->waiting)) == 0)
(*cond)->mutex = NULL;
InterlockedDecrement (&((*themutex)->condwaits));