summaryrefslogtreecommitdiff
path: root/libdrm
diff options
context:
space:
mode:
Diffstat (limited to 'libdrm')
-rw-r--r--libdrm/Makefile.am1
-rw-r--r--libdrm/xf86drm.c20
2 files changed, 20 insertions, 1 deletions
diff --git a/libdrm/Makefile.am b/libdrm/Makefile.am
index eb63abe1..71a87186 100644
--- a/libdrm/Makefile.am
+++ b/libdrm/Makefile.am
@@ -23,6 +23,7 @@ SUBDIRS = . intel
libdrm_la_LTLIBRARIES = libdrm.la
libdrm_ladir = $(libdir)
libdrm_la_LDFLAGS = -version-number 2:4:0 -no-undefined
+libdrm_la_LIBADD = -lrt
AM_CFLAGS = -I$(top_srcdir)/shared-core
libdrm_la_SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c \
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 0b5d31fe..3396e283 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -42,6 +42,7 @@
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
+#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#define stat_t struct stat
@@ -1896,13 +1897,30 @@ int drmScatterGatherFree(int fd, drm_handle_t handle)
*/
int drmWaitVBlank(int fd, drmVBlankPtr vbl)
{
+ struct timespec timeout, cur;
int ret;
+ ret = clock_gettime(CLOCK_MONOTONIC, &timeout);
+ if (ret < 0) {
+ fprintf(stderr, "clock_gettime failed: %s\n", strerror(ret));
+ goto out;
+ }
+ timeout.tv_sec++;
+
do {
- ret = drmIoctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
+ ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
vbl->request.type &= ~DRM_VBLANK_RELATIVE;
+ clock_gettime(CLOCK_MONOTONIC, &cur);
+ /* Timeout after 1s */
+ if (cur.tv_sec > timeout.tv_sec + 1 ||
+ cur.tv_sec == timeout.tv_sec && cur.tv_nsec >= timeout.tv_nsec) {
+ errno = EBUSY;
+ ret = -1;
+ break;
+ }
} while (ret && errno == EINTR);
+out:
return ret;
}