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