From: Jonathan Gray Date: Thu, 20 Feb 2020 02:18:01 +0000 (+1100) Subject: util: futex fixes for OpenBSD X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c66c5b38e0ad136aa9301fd60aafea736d433c57;p=mesa.git util: futex fixes for OpenBSD Fix absolute to relative timeout computation. Add sanity checks to futex_wait() - handle the NULL timeout pointer case - avoid negative cases. From Matthieu Herrb and Scott Cheloha. Fixes: c91997b6c43 ("util/futex: use futex syscall on OpenBSD") Signed-off-by: Jonathan Gray Acked-by: Eric Engestrom Part-of: --- diff --git a/src/util/futex.h b/src/util/futex.h index 4d712e2ef2d..43097f4cd5b 100644 --- a/src/util/futex.h +++ b/src/util/futex.h @@ -100,9 +100,16 @@ static inline int futex_wake(uint32_t *addr, int count) static inline int futex_wait(uint32_t *addr, int32_t value, const struct timespec *timeout) { - struct timespec tsrel, tsnow; - clock_gettime(CLOCK_MONOTONIC, &tsnow); - timespecsub(timeout, &tsrel, &tsrel); + struct timespec tsnow, tsrel; + + if (timeout == NULL) + return futex(addr, FUTEX_WAIT, value, NULL, NULL); + + clock_gettime(CLOCK_MONOTONIC, &tsnow); + if (timespeccmp(&tsnow, timeout, <)) + timespecsub(timeout, &tsnow, &tsrel); + else + timespecclear(&tsrel); return futex(addr, FUTEX_WAIT, value, &tsrel, NULL); }