|
|
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",
|