posix: cond: use clock specified via pthread_condattr_t

Use the clock specified via pthread_condattr_t in
pthread_cond_timedwait().

Signed-off-by: Chris Friedt <cfriedt@tenstorrent.com>
This commit is contained in:
Chris Friedt 2025-04-23 07:46:59 -04:00 committed by Benjamin Cabé
commit bb9ec32cf6

View file

@ -86,15 +86,17 @@ static struct posix_cond *to_posix_cond(pthread_cond_t *cvar)
/* Record the associated posix_cond in mu and mark as initialized */ /* Record the associated posix_cond in mu and mark as initialized */
*cvar = mark_pthread_obj_initialized(bit); *cvar = mark_pthread_obj_initialized(bit);
cv = &posix_cond_pool[bit]; cv = &posix_cond_pool[bit];
(void)pthread_condattr_init((pthread_condattr_t *)&cv->attr);
return cv; return cv;
} }
static int cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu, k_timeout_t timeout) static int cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu, const struct timespec *abstime)
{ {
int ret; int ret;
struct k_mutex *m; struct k_mutex *m;
struct posix_cond *cv; struct posix_cond *cv;
k_timeout_t timeout = K_FOREVER;
m = to_posix_mutex(mu); m = to_posix_mutex(mu);
cv = to_posix_cond(cond); cv = to_posix_cond(cond);
@ -102,6 +104,10 @@ static int cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu, k_timeout_t time
return EINVAL; return EINVAL;
} }
if (abstime != NULL) {
timeout = K_MSEC(timespec_to_clock_timeoutms(cv->attr.clock, abstime));
}
LOG_DBG("Waiting on cond %p with timeout %llx", cv, timeout.ticks); LOG_DBG("Waiting on cond %p with timeout %llx", cv, timeout.ticks);
ret = k_condvar_wait(&cv->condvar, m, timeout); ret = k_condvar_wait(&cv->condvar, m, timeout);
if (ret == -EAGAIN) { if (ret == -EAGAIN) {
@ -164,17 +170,18 @@ int pthread_cond_broadcast(pthread_cond_t *cvar)
int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut) int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut)
{ {
return cond_wait(cv, mut, K_FOREVER); return cond_wait(cv, mut, NULL);
} }
int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mut, const struct timespec *abstime) int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mut, const struct timespec *abstime)
{ {
return cond_wait(cv, mut, K_MSEC(timespec_to_timeoutms(abstime))); return cond_wait(cv, mut, abstime);
} }
int pthread_cond_init(pthread_cond_t *cvar, const pthread_condattr_t *att) int pthread_cond_init(pthread_cond_t *cvar, const pthread_condattr_t *att)
{ {
struct posix_cond *cv; struct posix_cond *cv;
struct posix_condattr *attr = (struct posix_condattr *)attr;
*cvar = PTHREAD_COND_INITIALIZER; *cvar = PTHREAD_COND_INITIALIZER;
cv = to_posix_cond(cvar); cv = to_posix_cond(cvar);
@ -182,6 +189,15 @@ int pthread_cond_init(pthread_cond_t *cvar, const pthread_condattr_t *att)
return ENOMEM; return ENOMEM;
} }
if (attr != NULL) {
if (!attr->initialized) {
return EINVAL;
}
(void)pthread_condattr_destroy((pthread_condattr_t *)&cv->attr);
cv->attr = *attr;
}
LOG_DBG("Initialized cond %p", cv); LOG_DBG("Initialized cond %p", cv);
return 0; return 0;