Sophie

Sophie

distrib > Mageia > 5 > x86_64 > by-pkgid > a5bd362e947dc28b69b7d28454104e86 > files > 2

libdrm-2.4.59-1.mga5.src.rpm

From 2b648f9980b90d62d30ca6248d2ee954d0514a8a Mon Sep 17 00:00:00 2001
From: Frederic Crozat <fcrozat@mandriva.com>
Date: Tue, 7 Apr 2009 16:31:22 +0200
Subject: [PATCH] improve waiting for dri device to appear when system is busy

---
 xf86drm.c |   29 +++++++++++++++++++++++++----
 1 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/xf86drm.c b/libdrm/xf86drm.c
index 7672ea5..963eaf2 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -92,6 +92,7 @@
 #define DRM_NODE_RENDER 1
 
 static drmServerInfoPtr drm_server_info;
+static int drmOpenDeviceSimpleCheck = 0;
 
 void drmSetServerInfo(drmServerInfoPtr info)
 {
@@ -325,22 +326,41 @@ static int drmOpenDevice(long dev, int minor, int type)
 #else
     /* if we modprobed then wait for udev */
     {
+	#define MAX_UDEV_COUNT 50
 	int udev_count = 0;
+	struct timespec delay_struct;
+
+	delay_struct.tv_sec = 0;
+
+	if (drmOpenDeviceSimpleCheck) {
+		udev_count = MAX_UDEV_COUNT-1;
+		delay_struct.tv_nsec = 0;
+		drmOpenDeviceSimpleCheck= 0;
+	}
+	else {
+		if (minor == 0) {
+			delay_struct.tv_nsec = 15000000;
+		}
+		else {
+			delay_struct.tv_nsec = 50000;
+		}
+	}
+
 wait_for_udev:
         if (stat(DRM_DIR_NAME, &st)) {
-		usleep(20);
+		nanosleep(&delay_struct, NULL);
 		udev_count++;
 
-		if (udev_count == 50)
+		if (udev_count == MAX_UDEV_COUNT)
 			return -1;
 		goto wait_for_udev;
 	}
 
     	if (stat(buf, &st)) {
-		usleep(20);
+		nanosleep(&delay_struct, NULL);
 		udev_count++;
 
-		if (udev_count == 50)
+		if (udev_count == MAX_UDEV_COUNT)
 			return -1;
 		goto wait_for_udev;
     	}
@@ -421,6 +441,7 @@ int drmAvailable(void)
     int           retval = 0;
     int           fd;
 
+    drmOpenDeviceSimpleCheck = 1;
     if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) {
 	return 0;
     }
-- 
1.6.2.4