diff --git a/.pick_status.json b/.pick_status.json index 6b9cdaf2946..236bfb93113 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -895,7 +895,7 @@ "description": "util: futex fixes for OpenBSD", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "c91997b6c4395831a8de2b84e6ea2ff981a00e4b" }, 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); }