diff options
author | Robert Collins <rbtcollins@hotmail.com> | 2001-06-21 22:27:20 +0000 |
---|---|---|
committer | Robert Collins <rbtcollins@hotmail.com> | 2001-06-21 22:27:20 +0000 |
commit | b643afa4c7f963743fcb805ce285927dd9be1001 (patch) | |
tree | e0d365d919492547c5516a9205cdaf51533b4deb /winsup/cygwin/thread.cc | |
parent | 9cc97acbd0a601622de1198d8b56db8be48e12fb (diff) | |
download | newlib-b643afa4c7f963743fcb805ce285927dd9be1001.zip newlib-b643afa4c7f963743fcb805ce285927dd9be1001.tar.gz newlib-b643afa4c7f963743fcb805ce285927dd9be1001.tar.bz2 |
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.
Diffstat (limited to 'winsup/cygwin/thread.cc')
-rw-r--r-- | winsup/cygwin/thread.cc | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 7ab45ae..7da2a75 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)); |