[PATCH 3/3] xfree86: Add a conservative SIGIO handler path

Adam Jackson ajax at redhat.com
Thu Oct 14 09:49:06 PDT 2010


Instead of actually processing input in the handler, the conservative
path just raises enough of a dispatch exception to bomb out of request
processing and handle input instead.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 configure.ac                   |    3 +++
 hw/xfree86/common/xf86Events.c |   34 ++++++++++++++++++++++++++--------
 include/xorg-config.h.in       |    3 +++
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/configure.ac b/configure.ac
index c0bf98f..8ad773e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -606,6 +606,9 @@ AC_ARG_ENABLE(aiglx,          AS_HELP_STRING([--enable-aiglx], [Build accelerate
 AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]),
                                 [GLX_USE_TLS=$enableval],
                                 [GLX_USE_TLS=no])
+AC_ARG_ENABLE(conservative-sigio, AS_HELP_STRING([--enable-conservative-sigio], [Build conservative SIGIO handler (default: disabled)]),
+				[CONSERVATIVE_SIGIO=$enableval],
+				[CONSERVATIVE_SIGIO=no])
 
 dnl Extensions.
 AC_ARG_ENABLE(registry,       AS_HELP_STRING([--disable-registry], [Build string registry module (default: enabled)]), [XREGISTRY=$enableval], [XREGISTRY=yes])
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 2e82848..34fb3cb 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -300,10 +300,30 @@ xf86SigioReadInput(int fd, void *closure)
     errno = errno_save;
 }
 
-/*
- * xf86AddEnabledDevice --
- *
- */
+#ifdef CONSERVATIVE_SIGIO
+
+static void
+time_to_yield(int fd, void *closure)
+{
+    isItTimeToYield = 1;
+}
+
+void
+xf86AddEnabledDevice(InputInfoPtr pInfo)
+{
+    xf86InstallSIGIOHandler(pInfo->fd, time_to_yield, NULL);
+    AddEnabledDevice(pInfo->fd);
+}
+
+void
+xf86RemoveEnabledDevice(InputInfoPtr pInfo)
+{
+    xf86RemoveSIGIOHandler(pInfo->fd);
+    RemoveEnabledDevice(pInfo->fd);
+}
+
+#else /* aggressive SIGIO */
+
 void
 xf86AddEnabledDevice(InputInfoPtr pInfo)
 {
@@ -312,10 +332,6 @@ xf86AddEnabledDevice(InputInfoPtr pInfo)
     }
 }
 
-/*
- * xf86RemoveEnabledDevice --
- *
- */
 void
 xf86RemoveEnabledDevice(InputInfoPtr pInfo)
 {
@@ -324,6 +340,8 @@ xf86RemoveEnabledDevice(InputInfoPtr pInfo)
     }
 }
 
+#endif
+
 static int *xf86SignalIntercept = NULL;
 
 void
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
index 56ffda2..e3797d6 100644
--- a/include/xorg-config.h.in
+++ b/include/xorg-config.h.in
@@ -142,4 +142,7 @@
 /* Build with libdrm support */
 #undef WITH_LIBDRM
 
+/* Conservative SIGIO handler */
+#undef CONSERVATIVE_SIGIO
+
 #endif /* _XORG_CONFIG_H_ */
-- 
1.7.2.3



More information about the xorg-devel mailing list