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

commit 0b868df147d613b6f277161eff4ac2834aa24ee7
Author: Corinna Vinschen <cori...@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

Reply via email to