Mesa (main): util/libsync: Fix timeout handling if poll() wakes up early
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Nov 9 04:32:07 UTC 2021
Module: Mesa
Branch: main
Commit: df92a13a270bea95f5c5260ee5de0c5b776f5131
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=df92a13a270bea95f5c5260ee5de0c5b776f5131
Author: Jesse Natalie <jenatali at microsoft.com>
Date: Tue Nov 2 10:10:01 2021 -0700
util/libsync: Fix timeout handling if poll() wakes up early
Check how long poll waited, and use a smaller timeout on the next
iteration through the loop.
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12268>
---
src/util/libsync.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/util/libsync.h b/src/util/libsync.h
index 1c9303c174a..0cb895a75d3 100644
--- a/src/util/libsync.h
+++ b/src/util/libsync.h
@@ -36,6 +36,7 @@
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <unistd.h>
+#include <time.h>
#if defined(__cplusplus)
extern "C" {
@@ -102,12 +103,15 @@ static inline int sync_wait(int fd, int timeout)
{
struct pollfd fds = {0};
int ret;
+ struct timespec poll_start, poll_end;
fds.fd = fd;
fds.events = POLLIN;
do {
+ clock_gettime(CLOCK_MONOTONIC, &poll_start);
ret = poll(&fds, 1, timeout);
+ clock_gettime(CLOCK_MONOTONIC, &poll_end);
if (ret > 0) {
if (fds.revents & (POLLERR | POLLNVAL)) {
errno = EINVAL;
@@ -118,6 +122,8 @@ static inline int sync_wait(int fd, int timeout)
errno = ETIME;
return -1;
}
+ timeout -= (poll_end.tv_sec - poll_start.tv_sec) * 1000 +
+ (poll_end.tv_nsec - poll_end.tv_nsec) / 1000000;
} while (ret == -1 && (errno == EINTR || errno == EAGAIN));
return ret;
More information about the mesa-commit
mailing list