#define MSEC_PER_SEC (1000)
static uint64_t
-rel2abs(uint64_t timeout)
+gettime_ns(void)
{
- struct timespec ts;
- uint64_t now;
+ struct timespec current;
+ clock_gettime(CLOCK_MONOTONIC, ¤t);
+ return (uint64_t)current.tv_sec * NSEC_PER_SEC + current.tv_nsec;
+}
- if (!timeout)
+static uint64_t
+rel2abs(uint64_t timeout)
+{
+ if (timeout == 0)
return 0;
- if (timeout == PIPE_TIMEOUT_INFINITE)
- return INT64_MAX;
-
- clock_gettime(CLOCK_MONOTONIC, &ts);
- now = ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec;
+ uint64_t current_time = gettime_ns();
+ uint64_t max_timeout = (uint64_t) INT64_MAX - current_time;
- if (now > INT64_MAX - timeout)
- return INT64_MAX;
+ timeout = MIN2(max_timeout, timeout);
- return now + timeout;
+ return current_time + timeout;
}
static bool
struct drm_syncobj_wait args = {
.handles = (uintptr_t)handles,
.count_handles = fence->count,
- .timeout_nsec = rel2abs(timeout), /* XXX */
+ .timeout_nsec = rel2abs(timeout),
.flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL
};
return gen_ioctl(screen->fd, DRM_IOCTL_SYNCOBJ_WAIT, &args) == 0;