[newlib-cygwin] Cygwin: pthread_cond_timedwait: make sure to wait until abstime finishes

Corinna Vinschen corinna@sourceware.org
Thu Nov 29 10:12:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=0b868df147d613b6f277161eff4ac2834aa24ee7

commit 0b868df147d613b6f277161eff4ac2834aa24ee7
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Wed Nov 28 23:49:59 2018 +0100

    Cygwin: pthread_cond_timedwait: make sure to wait until abstime finishes

Diff:
---
 winsup/cygwin/thread.cc | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 0bddaf3..c47a597 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -2945,25 +2945,33 @@ extern "C" int
 pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
 			const struct timespec *abstime)
 {
+  int err = 0;
   LARGE_INTEGER timeout;
 
   pthread_testcancel ();
 
   __try
     {
-      int err = __pthread_cond_wait_init (cond, mutex);
+      err = __pthread_cond_wait_init (cond, mutex);
       if (err)
-	return err;
+	__leave;
 
-      err = pthread_convert_abstime ((*cond)->clock_id, abstime, &timeout);
-      if (err)
-	return err;
+      do
+	{
+	  err = pthread_convert_abstime ((*cond)->clock_id, abstime, &timeout);
+	  if (err)
+	    __leave;
 
-      return (*cond)->wait (*mutex, &timeout);
+	  err = (*cond)->wait (*mutex, &timeout);
+	}
+      while (err == ETIMEDOUT);
+    }
+  __except (NO_ERROR)
+    {
+      return EINVAL;
     }
-  __except (NO_ERROR) {}
   __endtry
-  return EINVAL;
+  return err;
 }
 
 extern "C" int



More information about the Cygwin-cvs mailing list