diff -Naur libdrm-2.3.1.orig/libdrm/Makefile.am libdrm-2.3.1/libdrm/Makefile.am --- libdrm-2.3.1.orig/libdrm/Makefile.am 2008-07-01 09:51:40.000000000 +0200 +++ libdrm-2.3.1/libdrm/Makefile.am 2009-01-17 13:10:33.000000000 +0100 @@ -21,6 +21,7 @@ libdrm_la_LTLIBRARIES = libdrm.la libdrm_ladir = $(libdir) libdrm_la_LDFLAGS = -version-number 2:3:1 -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 -Naur libdrm-2.3.1.orig/libdrm/Makefile.in libdrm-2.3.1/libdrm/Makefile.in --- libdrm-2.3.1.orig/libdrm/Makefile.in 2008-07-01 09:55:48.000000000 +0200 +++ libdrm-2.3.1/libdrm/Makefile.in 2009-01-17 13:11:27.000000000 +0100 @@ -73,7 +73,7 @@ "$(DESTDIR)$(libdrmincludedir)" libdrm_laLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(libdrm_la_LTLIBRARIES) -libdrm_la_LIBADD = +libdrm_la_LIBADD = -lrt am_libdrm_la_OBJECTS = xf86drm.lo xf86drmHash.lo xf86drmRandom.lo \ xf86drmSL.lo libdrm_la_OBJECTS = $(am_libdrm_la_OBJECTS) diff -Naur libdrm-2.3.1.orig/libdrm/xf86drm.c libdrm-2.3.1/libdrm/xf86drm.c --- libdrm-2.3.1.orig/libdrm/xf86drm.c 2008-07-01 09:51:40.000000000 +0200 +++ libdrm-2.3.1/libdrm/xf86drm.c 2009-01-17 13:10:33.000000000 +0100 @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #define stat_t struct stat @@ -1851,13 +1852,30 @@ */ 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 = 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; }