From b643afa4c7f963743fcb805ce285927dd9be1001 Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Thu, 21 Jun 2001 22:27:20 +0000 Subject: [PATCH] 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. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/thread.cc | 4 ++-- 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 + + * 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 * 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));