From 68c7dc6b9647405089bdf882261d4cf7d302d7d7 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Tue, 27 Aug 2019 15:37:49 +0300 Subject: [PATCH] posix: pthread: pthread_cond_timedwait should accept absolute deadline Instead, it was coded as if it accepted a relative timeout. Normative reference: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_timedwait.html Fixes: #17812 Signed-off-by: Paul Sokolovsky --- include/posix/pthread.h | 2 +- lib/posix/pthread_cond.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/posix/pthread.h b/include/posix/pthread.h index 19846b93c77..cd96f26ac7c 100644 --- a/include/posix/pthread.h +++ b/include/posix/pthread.h @@ -124,7 +124,7 @@ int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut); * See IEEE 1003.1 */ int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mut, - const struct timespec *to); + const struct timespec *abstime); /** * @brief POSIX threading compatibility API diff --git a/lib/posix/pthread_cond.c b/lib/posix/pthread_cond.c index 7bde01ee957..d6e839247a9 100644 --- a/lib/posix/pthread_cond.c +++ b/lib/posix/pthread_cond.c @@ -9,6 +9,8 @@ #include #include +s64_t timespec_to_timeoutms(const struct timespec *abstime); + static int cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut, int timeout) { __ASSERT(mut->lock_count == 1U, ""); @@ -73,8 +75,9 @@ int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut) } int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mut, - const struct timespec *to) + const struct timespec *abstime) { - return cond_wait(cv, mut, _ts_to_ms(to)); + s32_t timeout = (s32_t)timespec_to_timeoutms(abstime); + return cond_wait(cv, mut, timeout); }