From 0b868df147d613b6f277161eff4ac2834aa24ee7 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 28 Nov 2018 23:49:59 +0100 Subject: [PATCH] Cygwin: pthread_cond_timedwait: make sure to wait until abstime finishes --- 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 0bddaf345..c47a597be 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