eb5ef29
--- xorg-server-1.1.1/hw/xfree86/os-support/linux/lnx_init.c.jx	2006-07-05 14:31:41.000000000 -0400
eb5ef29
+++ xorg-server-1.1.1/hw/xfree86/os-support/linux/lnx_init.c	2006-09-26 17:53:04.000000000 -0400
eb5ef29
@@ -248,14 +248,37 @@
eb5ef29
 #endif
eb5ef29
 	    /*
eb5ef29
 	     * now get the VT
eb5ef29
+	     *
eb5ef29
+	     * There's a race here, in that if someone else does a VT_ACTIVATE
eb5ef29
+	     * between our ACTIVATE/WAITACTIVE, we might never get the VT.
eb5ef29
+	     * So, just spin until we do.  There's really no fixing this,
eb5ef29
+	     * it's a racy protocol.
eb5ef29
 	     */
eb5ef29
-	    if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) < 0)
eb5ef29
-	        xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed: %s\n",
eb5ef29
-		        strerror(errno));
eb5ef29
+	    while (1) {
eb5ef29
+		if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) < 0)
eb5ef29
+		    FatalError(X_WARNING,
eb5ef29
+			       "xf86OpenConsole: VT_ACTIVATE failed: %s\n",
eb5ef29
+			       strerror(errno));
eb5ef29
 
eb5ef29
-	    if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) < 0)
eb5ef29
-	        xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed: %s\n",
eb5ef29
-		    strerror(errno));
eb5ef29
+
eb5ef29
+		alarm(5);
eb5ef29
+		if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) < 0)
eb5ef29
+		{
eb5ef29
+		    if (errno == EINTR) {
eb5ef29
+			/* we lost the race and the alarm fired, try again */
eb5ef29
+			xf86Msg(X_WARNING,
eb5ef29
+				"Lost VT_WAITACTIVE race, retrying\n");
eb5ef29
+			continue;
eb5ef29
+		    }
eb5ef29
+
eb5ef29
+		    FatalError("xf86OpenConsole: VT_WAITACTIVE failed: %s\n",
eb5ef29
+			       strerror(errno));
eb5ef29
+		}
eb5ef29
+		/* success, turn off the alarm */
eb5ef29
+		alarm(0);
eb5ef29
+
eb5ef29
+		break;
eb5ef29
+	    }
eb5ef29
 
eb5ef29
 	    if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
eb5ef29
 	        FatalError("xf86OpenConsole: VT_GETMODE failed %s\n",