[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-xorg-devel
Subject:    Re: [PATCH xserver 2/9] Remove SIGIO support for input [v2]
From:       Keith Packard <keithp () keithp ! com>
Date:       2015-12-18 6:29:46
Message-ID: 86twngs205.fsf () hiro ! keithp ! com
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Peter Hutterer <peter.hutterer@who-t.net> writes:

> don't know what the point of saving errno is here, but this should be a
> separate patch, you're changing functionality here.

It's saving errno during a signal handler; now that we have no signal
handler, we don't need to save errno anymore. Not that I think we
actually needed to save errno here; it looks like cult code to me. I'll
split it out into a separate patch.

> the FALSE needs a comment, otherwise it's confusing.

Ok, I'll add the comment in this patch and remove it in the next.

> shouldn't this be in the previous patch?

I think those two patches should probably be merged together; the stubs
aren't used until this patch. Let me do that.

Here's an amended version of this patch which has been squashed with the
first patch that added the stubs, and has had the errno wrapping left
in in xf86Events., along with newly worded comments in xf86Helper.c.

I've added a patch to the series which separately removes the errno
wrapping bits in xf86Events.c, and then changed the input thread adding code to reword
the comment in xf86Helper.c. The overall change at the end is just a
better wording of the comment in xf86Helper.c. I've pushed out a new
version of my input-thread branch to my tree if you want to see the
whole series.

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 0aeefd6..4a17430 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -1725,9 +1725,7 @@ xf86SetSilkenMouse(ScreenPtr pScreen)
     }
     free(options);
     /*
-     * XXX quick hack to report correctly for OSs that can't do SilkenMouse
-     * yet.  Should handle this differently so that alternate async methods
-     * work correctly with this too.
+     * Use silken mouse if requested and if we have threaded input
      */
     pScrn->silkenMouse = useSM && InputThreadEnable;
     if (serverGeneration == 1)


["0001-Remove-SIGIO-support-for-input-v3.patch" (text/x-diff)]

From 399961d249d8483f261824beea9a3a2b0eda97b1 Mon Sep 17 00:00:00 2001
From: Keith Packard <keithp@keithp.com>
Date: Tue, 8 Dec 2015 14:39:46 -0800
Subject: [PATCH xserver 1/8] Remove SIGIO support for input [v3]

This removes all of the SIGIO handling support used for input
throughout the X server, preparing the way for using threads for input
handling instead.

Places calling OsBlockSIGIO and OsReleaseSIGIO are marked with calls
to stub functions input_lock/input_unlock so that we don't lose this
information.

xfree86 SIGIO support is reworked to use internal versions of
OsBlockSIGIO and OsReleaseSIGIO.

v2: Don't change locking order (Peter Hutterer)
v3: Comment weird && FALSE in xf86Helper.c
    Leave errno save/restore in xf86ReadInput
    Squash with stub adding patch (Peter Hutterer)

Signed-off-by: Keith Packard <keithp@keithp.com>
---
 Xi/exevents.c                             |   4 +-
 config/config.c                           |   4 +-
 configure.ac                              |  14 ---
 dix/devices.c                             |  10 +-
 dix/ptrveloc.c                            |   4 +-
 dix/touch.c                               |   8 +-
 hw/dmx/input/dmxevents.c                  |  24 ++---
 hw/kdrive/ephyr/ephyr.c                   |   4 +-
 hw/kdrive/src/kinput.c                    |  74 ++-----------
 hw/xfree86/common/xf86Config.c            |  24 -----
 hw/xfree86/common/xf86Cursor.c            |   8 +-
 hw/xfree86/common/xf86Events.c            |  29 +++---
 hw/xfree86/common/xf86Helper.c            |   6 +-
 hw/xfree86/common/xf86Init.c              |   6 +-
 hw/xfree86/common/xf86PM.c                |   8 +-
 hw/xfree86/common/xf86Xinput.c            |   8 +-
 hw/xfree86/os-support/shared/sigio.c      |  57 +++++-----
 hw/xfree86/os-support/shared/sigiostubs.c |  23 -----
 hw/xfree86/os-support/xf86_OSproc.h       |   4 -
 include/input.h                           |   9 ++
 include/os.h                              |   6 --
 include/xorg-config.h.in                  |   3 -
 mi/mieq.c                                 |   6 +-
 mi/mipointer.c                            |   4 +-
 os/utils.c                                |  55 +---------
 test/Makefile.am                          |   2 +-
 test/os.c                                 | 166 ------------------------------
 xkb/xkbActions.c                          |   4 +-
 28 files changed, 113 insertions(+), 461 deletions(-)
 delete mode 100644 test/os.c

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 74e49ed..696e244 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -661,7 +661,7 @@ void
 DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to,
                       DeviceChangedEvent *dce)
 {
-    OsBlockSIGIO();
+    input_lock();
 
     /* generic feedback classes, not tied to pointer and/or keyboard */
     DeepCopyFeedbackClasses(from, to);
@@ -671,7 +671,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to,
     if ((dce->flags & DEVCHANGE_POINTER_EVENT))
         DeepCopyPointerClasses(from, to);
 
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 /**
diff --git a/config/config.c b/config/config.c
index de45cc3..1fb368c 100644
--- a/config/config.c
+++ b/config/config.c
@@ -86,10 +86,10 @@ remove_device(const char *backend, DeviceIntPtr dev)
 
     /* Call PIE here so we don't try to dereference a device that's
      * already been removed. */
-    OsBlockSignals();
+    input_lock();
     ProcessInputEvents();
     DeleteInputDeviceRequest(dev);
-    OsReleaseSignals();
+    input_unlock();
 }
 
 void
diff --git a/configure.ac b/configure.ac
index 2e38efa..5a43db3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -380,7 +380,6 @@ AM_CONDITIONAL(PPC_VIDEO, [test "x$PPC_VIDEO" = xyes])
 AM_CONDITIONAL(SPARC64_VIDEO, [test "x$SPARC64_VIDEO" = xyes])
 
 DRI=no
-USE_SIGIO_BY_DEFAULT="yes"
 dnl it would be nice to autodetect these *CONS_SUPPORTs
 case $host_os in
   *freebsd* | *dragonfly*)
@@ -410,9 +409,6 @@ case $host_os in
 	;;
   *solaris*)
 	PKG_CHECK_EXISTS(libdrm, DRI=yes, DRI=no)
-	# Disable use of SIGIO by default until some system bugs are
-	# fixed - see Sun/OpenSolaris bug id 6879897
-	USE_SIGIO_BY_DEFAULT="no"
 	;;
   darwin*)
 	AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
@@ -445,9 +441,6 @@ AC_ARG_ENABLE(werror,        AS_HELP_STRING([--enable-werror],
 AC_ARG_ENABLE(debug,         AS_HELP_STRING([--enable-debug],
 				  [Enable debugging (default: disabled)]),
 			        [DEBUGGING=$enableval], [DEBUGGING=no])
-AC_ARG_ENABLE(use-sigio-by-default, AS_HELP_STRING([--enable-use-sigio-by-default]
-  [Enable SIGIO input handlers by default (default: $USE_SIGIO_BY_DEFAULT)]),
-                                [USE_SIGIO_BY_DEFAULT=$enableval], [])
 AC_ARG_WITH(int10,           AS_HELP_STRING([--with-int10=BACKEND], [int10 backend: \
vm86, x86emu or stub]),  [INT10="$withval"],
 				[INT10="$DEFAULT_INT10"])
@@ -953,13 +946,6 @@ if test "x$CONFIG_WSCONS" = xyes; then
 	AC_DEFINE(CONFIG_WSCONS, 1, [Use wscons for input auto configuration])
 fi
 
-if test "x$USE_SIGIO_BY_DEFAULT" = xyes; then
-	USE_SIGIO_BY_DEFAULT_VALUE=TRUE
-else
-	USE_SIGIO_BY_DEFAULT_VALUE=FALSE
-fi
-AC_DEFINE_UNQUOTED([USE_SIGIO_BY_DEFAULT], [$USE_SIGIO_BY_DEFAULT_VALUE],
-		   [Use SIGIO handlers for input device events by default])
 
 AC_MSG_CHECKING([for glibc...])
 AC_PREPROC_IFELSE([AC_LANG_SOURCE([
diff --git a/dix/devices.c b/dix/devices.c
index 9b0c7d2..7ba6b94 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -491,14 +491,14 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
 
     FreeSprite(dev);
 
-    /* now that the device is disabled, we can reset the signal handler's
+    /* now that the device is disabled, we can reset the event reader's
      * last.slave */
-    OsBlockSignals();
+    input_lock();
     for (other = inputInfo.devices; other; other = other->next) {
         if (other->last.slave == dev)
             other->last.slave = NULL;
     }
-    OsReleaseSignals();
+    input_unlock();
 
     LeaveWindow(dev);
     SetFocusOut(dev);
@@ -1031,7 +1031,7 @@ CloseDownDevices(void)
 {
     DeviceIntPtr dev;
 
-    OsBlockSignals();
+    input_lock();
 
     /* Float all SDs before closing them. Note that at this point resources
      * (e.g. cursors) have been freed already, so we can't just call
@@ -1058,7 +1058,7 @@ CloseDownDevices(void)
     XkbDeleteRulesDflts();
     XkbDeleteRulesUsed();
 
-    OsReleaseSignals();
+    input_unlock();
 }
 
 /**
diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index e75300a..1b63c51 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -159,7 +159,7 @@ AccelerationDefaultCleanup(DeviceIntPtr dev)
          * AccelSchemeProc(), but that seems impossible. Schemes don't get
          * switched often anyway.
          */
-        OsBlockSignals();
+        input_lock();
         dev->valuator->accelScheme.AccelSchemeProc = NULL;
         FreeVelocityData(vel);
         free(vel);
@@ -169,7 +169,7 @@ AccelerationDefaultCleanup(DeviceIntPtr dev)
                                                 accelData);
         free(dev->valuator->accelScheme.accelData);
         dev->valuator->accelScheme.accelData = NULL;
-        OsReleaseSignals();
+        input_unlock();
     }
 }
 
diff --git a/dix/touch.c b/dix/touch.c
index 54da132..4c0412a 100644
--- a/dix/touch.c
+++ b/dix/touch.c
@@ -79,7 +79,7 @@ TouchResizeQueue(ClientPtr client, void *closure)
 {
     int i;
 
-    OsBlockSignals();
+    input_lock();
 
     /* first two ids are reserved */
     for (i = 2; i < MAXDEVICES; i++) {
@@ -112,7 +112,7 @@ TouchResizeQueue(ClientPtr client, void *closure)
         }
 
     }
-    OsReleaseSignals();
+    input_unlock();
 
     return TRUE;
 }
@@ -1077,7 +1077,7 @@ TouchEndPhysicallyActiveTouches(DeviceIntPtr dev)
     InternalEvent *eventlist = InitEventList(GetMaximumEventsNum());
     int i;
 
-    OsBlockSignals();
+    input_lock();
     mieqProcessInputEvents();
     for (i = 0; i < dev->last.num_touches; i++) {
         DDXTouchPointInfoPtr ddxti = dev->last.touches + i;
@@ -1091,7 +1091,7 @@ TouchEndPhysicallyActiveTouches(DeviceIntPtr dev)
                 mieqProcessDeviceEvent(dev, eventlist + j, NULL);
         }
     }
-    OsReleaseSignals();
+    input_unlock();
 
     FreeEventList(eventlist, GetMaximumEventsNum());
 }
diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c
index 2b579ee..3789602 100644
--- a/hw/dmx/input/dmxevents.c
+++ b/hw/dmx/input/dmxevents.c
@@ -227,25 +227,25 @@ dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, \
DMXBlockType block)  && pScreen->myNum == dmxScreen->index) {
             /* Screen is old screen */
             if (block)
-                OsBlockSIGIO();
+                input_lock();
             if (pDev)
                 enqueueMotion(pDev, localX, localY);
             if (block)
-                OsReleaseSIGIO();
+                input_unlock();
         }
         else {
             /* Screen is new */
             DMXDBG4("   New screen: old=%d new=%d localX=%d localY=%d\n",
                     pScreen->myNum, dmxScreen->index, localX, localY);
             if (block)
-                OsBlockSIGIO();
+                input_lock();
             mieqProcessInputEvents();
             miPointerSetScreen(inputInfo.pointer, dmxScreen->index,
                                localX, localY);
             if (pDev)
                 enqueueMotion(pDev, localX, localY);
             if (block)
-                OsReleaseSIGIO();
+                input_unlock();
         }
 #if 00
         miPointerGetPosition(inputInfo.pointer, &localX, &localY);
@@ -387,12 +387,12 @@ dmxExtMotion(DMXLocalInputInfoPtr dmxLocal,
     }
 
     if (block)
-        OsBlockSIGIO();
+        input_lock();
     valuator_mask_set_range(&mask, firstAxis, axesCount, v);
     QueuePointerEvents(pDevice, MotionNotify, 0, POINTER_ABSOLUTE, &mask);
 
     if (block)
-        OsReleaseSIGIO();
+        input_unlock();
 }
 
 static int
@@ -489,10 +489,10 @@ dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
     case XI_DeviceKeyPress:
     case XI_DeviceKeyRelease:
         if (block)
-            OsBlockSIGIO();
+            input_lock();
         QueueKeyboardEvents(pDevice, event, ke->keycode);
         if (block)
-            OsReleaseSIGIO();
+            input_unlock();
         break;
     case XI_DeviceButtonPress:
     case XI_DeviceButtonRelease:
@@ -500,11 +500,11 @@ dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
         valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count,
                                 valuators);
         if (block)
-            OsBlockSIGIO();
+            input_lock();
         QueuePointerEvents(pDevice, event, ke->keycode,
                            POINTER_ABSOLUTE, &mask);
         if (block)
-            OsReleaseSIGIO();
+            input_unlock();
         break;
     case XI_ProximityIn:
     case XI_ProximityOut:
@@ -512,10 +512,10 @@ dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
         valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count,
                                 valuators);
         if (block)
-            OsBlockSIGIO();
+            input_lock();
         QueueProximityEvents(pDevice, event, &mask);
         if (block)
-            OsReleaseSIGIO();
+            input_unlock();
         break;
 
         break;
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 896bac5..e98cd12 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -836,11 +836,11 @@ ScreenPtr ephyrCursorScreen; /* screen containing the cursor */
 static void
 ephyrWarpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
-    OsBlockSIGIO();
+    input_lock();
     ephyrCursorScreen = pScreen;
     miPointerWarpCursor(inputInfo.pointer, pScreen, x, y);
 
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 miPointerScreenFuncRec ephyrPointerScreenFuncs = {
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 1fdaa52..8527a9e 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -93,38 +93,6 @@ static int kdNumInputFds;
 
 extern Bool kdRawPointerCoordinates;
 
-static void
-KdSigio(int sig)
-{
-    int i;
-
-    for (i = 0; i < kdNumInputFds; i++)
-        (*kdInputFds[i].read) (kdInputFds[i].fd, kdInputFds[i].closure);
-}
-
-#ifdef DEBUG_SIGIO
-
-void
-KdAssertSigioBlocked(char *where)
-{
-    sigset_t set, old;
-
-    sigemptyset(&set);
-    sigprocmask(SIG_BLOCK, &set, &old);
-    if (!sigismember(&old, SIGIO)) {
-        ErrorF("SIGIO not blocked at %s\n", where);
-        KdBacktrace(0);
-    }
-}
-
-#else
-
-#define KdAssertSigioBlocked(s)
-
-#endif
-
-static int kdnFds;
-
 #ifdef FNONBLOCK
 #define NOBLOCK FNONBLOCK
 #else
@@ -156,51 +124,25 @@ static void
 KdNotifyFd(int fd, int ready, void *data)
 {
     int i = (int) (intptr_t) data;
-    OsBlockSIGIO();
     (*kdInputFds[i].read)(fd, kdInputFds[i].closure);
-    OsReleaseSIGIO();
 }
 
 static void
 KdAddFd(int fd, int i)
 {
-    struct sigaction act;
-    sigset_t set;
-
-    kdnFds++;
-    fcntl(fd, F_SETOWN, getpid());
     KdNonBlockFd(fd);
-    AddEnabledDevice(fd);
     SetNotifyFd(fd, KdNotifyFd, X_NOTIFY_READ, (void *) (intptr_t) i);
-    memset(&act, '\0', sizeof act);
-    act.sa_handler = KdSigio;
-    sigemptyset(&act.sa_mask);
-    sigaddset(&act.sa_mask, SIGIO);
-    sigaddset(&act.sa_mask, SIGALRM);
-    sigaddset(&act.sa_mask, SIGVTALRM);
-    sigaction(SIGIO, &act, 0);
-    sigemptyset(&set);
-    sigprocmask(SIG_SETMASK, &set, 0);
 }
 
 static void
 KdRemoveFd(int fd)
 {
-    struct sigaction act;
     int flags;
 
-    kdnFds--;
-    RemoveEnabledDevice(fd);
     RemoveNotifyFd(fd);
     flags = fcntl(fd, F_GETFL);
     flags &= ~(FASYNC | NOBLOCK);
     fcntl(fd, F_SETFL, flags);
-    if (kdnFds == 0) {
-        memset(&act, '\0', sizeof act);
-        act.sa_handler = SIG_IGN;
-        sigemptyset(&act.sa_mask);
-        sigaction(SIGIO, &act, 0);
-    }
 }
 
 Bool
@@ -252,7 +194,7 @@ KdDisableInput(void)
     KdPointerInfo *pi;
     int found = 0, i = 0;
 
-    OsBlockSIGIO();
+    input_lock();
 
     for (ki = kdKeyboards; ki; ki = ki->next) {
         if (ki->driver && ki->driver->Disable)
@@ -335,7 +277,7 @@ KdEnableInput(void)
         NoticeEventTime (&ev, pi->dixdev);
     }
 
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 static KdKeyboardDriver *
@@ -1751,7 +1693,7 @@ KdReleaseAllKeys(void)
     int key;
     KdKeyboardInfo *ki;
 
-    OsBlockSIGIO();
+    input_lock();
 
     for (ki = kdKeyboards; ki; ki = ki->next) {
         for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode; key++) {
@@ -1762,7 +1704,7 @@ KdReleaseAllKeys(void)
         }
     }
 
-    OsReleaseSIGIO();
+    input_unlock();
 #endif
 }
 
@@ -1950,9 +1892,9 @@ KdWakeupHandler(ScreenPtr pScreen, unsigned long lresult, void \
*readmask)  if (pi->timeoutPending) {
             if ((long) (GetTimeInMillis() - pi->emulationTimeout) >= 0) {
                 pi->timeoutPending = FALSE;
-                OsBlockSIGIO();
+                input_lock();
                 KdReceiveTimeout(pi);
-                OsReleaseSIGIO();
+                input_unlock();
             }
         }
     }
@@ -2049,10 +1991,10 @@ int KdCurScreen;                /* current event screen */
 static void
 KdWarpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
-    OsBlockSIGIO();
+    input_lock();
     KdCurScreen = pScreen->myNum;
     miPointerWarpCursor(pDev, pScreen, x, y);
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 miPointerScreenFuncRec kdPointerScreenFuncs = {
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index d2c3225..07afd42 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -701,7 +701,6 @@ typedef enum {
     FLAG_AUTO_ENABLE_DEVICES,
     FLAG_GLX_VISUALS,
     FLAG_DRI2,
-    FLAG_USE_SIGIO,
     FLAG_AUTO_ADD_GPU,
     FLAG_MAX_CLIENTS,
 } FlagValues;
@@ -759,8 +758,6 @@ static OptionInfoRec FlagOptions[] = {
      {0}, FALSE},
     {FLAG_DRI2, "DRI2", OPTV_BOOLEAN,
      {0}, FALSE},
-    {FLAG_USE_SIGIO, "UseSIGIO", OPTV_BOOLEAN,
-     {0}, FALSE},
     {FLAG_AUTO_ADD_GPU, "AutoAddGPU", OPTV_BOOLEAN,
      {0}, FALSE},
     {FLAG_MAX_CLIENTS, "MaxClients", OPTV_INTEGER,
@@ -808,27 +805,6 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr \
layoutopts)  xf86Msg(X_CONFIG, "Ignoring ABI Version\n");
     }
 
-    if (xf86SIGIOSupported()) {
-        xf86Info.useSIGIO =
-            xf86ReturnOptValBool(FlagOptions, FLAG_USE_SIGIO,
-                                 USE_SIGIO_BY_DEFAULT);
-        if (xf86IsOptionSet(FlagOptions, FLAG_USE_SIGIO)) {
-            from = X_CONFIG;
-        }
-        else {
-            from = X_DEFAULT;
-        }
-        if (!xf86Info.useSIGIO) {
-            xf86Msg(from, "Disabling SIGIO handlers for input devices\n");
-        }
-        else if (from == X_CONFIG) {
-            xf86Msg(from, "Enabling SIGIO handlers for input devices\n");
-        }
-    }
-    else {
-        xf86Info.useSIGIO = FALSE;
-    }
-
     if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_ADD_DEVICES)) {
         xf86GetOptValBool(FlagOptions, FLAG_AUTO_ADD_DEVICES,
                           &xf86Info.autoAddDevices);
diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 92c08af..de054fb 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -221,7 +221,7 @@ xf86SwitchMode(ScreenPtr pScreen, DisplayModePtr mode)
     if (pScreen == pCursorScreen)
         miPointerGetPosition(dev, &px, &py);
 
-    OsBlockSIGIO();
+    input_lock();
     Switched = (*pScr->SwitchMode) (pScr, mode);
     if (Switched) {
         pScr->currentMode = mode;
@@ -260,7 +260,7 @@ xf86SwitchMode(ScreenPtr pScreen, DisplayModePtr mode)
             pScr->frameY1 = pScr->virtualY - 1;
         }
     }
-    OsReleaseSIGIO();
+    input_unlock();
 
     if (pScr->AdjustFrame)
         (*pScr->AdjustFrame) (pScr, pScr->frameX0, pScr->frameY0);
@@ -452,11 +452,11 @@ xf86CrossScreen(ScreenPtr pScreen, Bool entering)
 static void
 xf86WarpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
-    OsBlockSIGIO();
+    input_lock();
     miPointerWarpCursor(pDev, pScreen, x, y);
 
     xf86Info.currentScreen = pScreen;
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 void *
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 709afd6..81416ed 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -259,7 +259,7 @@ xf86Wakeup(void *blockData, int err, void *pReadmask)
             while (pInfo) {
                 if (pInfo->read_input && pInfo->fd >= 0 &&
                     (FD_ISSET(pInfo->fd, &devicesWithInput) != 0)) {
-                    OsBlockSIGIO();
+                    input_lock();
 
                     /*
                      * Remove the descriptior from the set because more than one
@@ -268,7 +268,7 @@ xf86Wakeup(void *blockData, int err, void *pReadmask)
                     FD_CLR(pInfo->fd, &devicesWithInput);
 
                     pInfo->read_input(pInfo);
-                    OsReleaseSIGIO();
+                    input_unlock();
                 }
                 pInfo = pInfo->next;
             }
@@ -291,11 +291,12 @@ xf86Wakeup(void *blockData, int err, void *pReadmask)
 }
 
 /*
- * xf86SigioReadInput --
- *    signal handler for the SIGIO signal.
+ * xf86ReadInput --
+ *    input thread handler
  */
+
 static void
-xf86SigioReadInput(int fd, void *closure)
+xf86ReadInput(int fd, int ready, void *closure)
 {
     int errno_save = errno;
     InputInfoPtr pInfo = closure;
@@ -312,9 +313,7 @@ xf86SigioReadInput(int fd, void *closure)
 void
 xf86AddEnabledDevice(InputInfoPtr pInfo)
 {
-    if (!xf86InstallSIGIOHandler(pInfo->fd, xf86SigioReadInput, pInfo)) {
-        AddEnabledDevice(pInfo->fd);
-    }
+    SetNotifyFd(pInfo->fd, xf86ReadInput, X_NOTIFY_READ, pInfo);
 }
 
 /*
@@ -324,9 +323,7 @@ xf86AddEnabledDevice(InputInfoPtr pInfo)
 void
 xf86RemoveEnabledDevice(InputInfoPtr pInfo)
 {
-    if (!xf86RemoveSIGIOHandler(pInfo->fd)) {
-        RemoveEnabledDevice(pInfo->fd);
-    }
+    RemoveNotifyFd(pInfo->fd);
 }
 
 static int *xf86SignalIntercept = NULL;
@@ -402,9 +399,9 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
     for (i = keyc->xkbInfo->desc->min_key_code;
          i < keyc->xkbInfo->desc->max_key_code; i++) {
         if (key_is_down(pDev, i, KEY_POSTED)) {
-            OsBlockSIGIO();
+            input_lock();
             QueueKeyboardEvents(pDev, KeyRelease, i);
-            OsReleaseSIGIO();
+            input_unlock();
         }
     }
 }
@@ -487,7 +484,7 @@ xf86VTLeave(void)
     for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
         xf86DisableInputDeviceForVTSwitch(pInfo);
 
-    OsBlockSIGIO();
+    input_lock();
     for (i = 0; i < xf86NumScreens; i++)
         xf86Screens[i]->LeaveVT(xf86Screens[i]);
     for (i = 0; i < xf86NumGPUScreens; i++)
@@ -545,7 +542,7 @@ switch_failed:
         else
             xf86EnableGeneralHandler(ih);
     }
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 void
@@ -603,7 +600,7 @@ xf86VTEnter(void)
 
     xf86UpdateHasVTProperty(TRUE);
 
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 /*
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index c42e93e..1e63185 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -1729,7 +1729,11 @@ xf86SetSilkenMouse(ScreenPtr pScreen)
      * yet.  Should handle this differently so that alternate async methods
      * work correctly with this too.
      */
-    pScrn->silkenMouse = useSM && xf86Info.useSIGIO && xf86SIGIOSupported();
+    /* Disable this completely when removing SIGIO support. It
+     * will get re-enabled correctly when we add threaded input
+     * support
+     */
+    pScrn->silkenMouse = useSM && FALSE;
     if (serverGeneration == 1)
         xf86DrvMsg(pScreen->myNum, from, "Silken mouse %s\n",
                    pScrn->silkenMouse ? "enabled" : "disabled");
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 017dcb6..5281e3e 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -823,7 +823,7 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
             ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ);
 #endif
             xf86AccessEnter();
-            OsBlockSIGIO();
+            input_lock();
             sigio_blocked = TRUE;
         }
     }
@@ -931,7 +931,7 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
 
     xf86VGAarbiterWrapFunctions();
     if (sigio_blocked)
-        OsReleaseSIGIO();
+        input_unlock();
 
     xf86InitOrigins();
 
@@ -1077,7 +1077,7 @@ AbortDDX(enum ExitCode error)
 {
     int i;
 
-    OsBlockSIGIO();
+    input_lock();
 
     /*
      * try to restore the original video state
diff --git a/hw/xfree86/common/xf86PM.c b/hw/xfree86/common/xf86PM.c
index 9e49e8e..3f08c81 100644
--- a/hw/xfree86/common/xf86PM.c
+++ b/hw/xfree86/common/xf86PM.c
@@ -107,7 +107,7 @@ suspend(pmEvent event, Bool undo)
         DisableDevice(pInfo->dev, TRUE);
         pInfo = pInfo->next;
     }
-    OsBlockSIGIO();
+    input_lock();
     for (i = 0; i < xf86NumScreens; i++) {
         if (xf86Screens[i]->PMEvent)
             xf86Screens[i]->PMEvent(xf86Screens[i], event, undo);
@@ -135,7 +135,7 @@ resume(pmEvent event, Bool undo)
             xf86Screens[i]->EnterVT(xf86Screens[i]);
         }
     }
-    OsReleaseSIGIO();
+    input_unlock();
     for (i = 0; i < xf86NumScreens; i++) {
         if (xf86Screens[i]->EnableDisableFBAccess)
             (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
@@ -182,13 +182,13 @@ DoApmEvent(pmEvent event, Bool undo)
         }
         break;
     default:
-        OsBlockSIGIO();
+        input_lock();
         for (i = 0; i < xf86NumScreens; i++) {
             if (xf86Screens[i]->PMEvent) {
                 xf86Screens[i]->PMEvent(xf86Screens[i], event, undo);
             }
         }
-        OsReleaseSIGIO();
+        input_unlock();
         break;
     }
 }
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index c56a2b9..481a760 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -925,7 +925,7 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL \
enable)  
     /* Enable it if it's properly initialised and we're currently in the VT */
     if (enable && dev->inited && dev->startup && xf86VTOwner()) {
-        OsBlockSignals();
+        input_lock();
         EnableDevice(dev, TRUE);
         if (!dev->enabled) {
             OsReleaseSignals();
@@ -936,7 +936,7 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL \
enable)  }
         /* send enter/leave event, update sprite window */
         CheckMotion(NULL, dev);
-        OsReleaseSignals();
+        input_unlock();
     }
 
     *pdev = dev;
@@ -1069,7 +1069,7 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
     if (pInfo)                  /* need to get these before RemoveDevice */
         drv = pInfo->drv;
 
-    OsBlockSignals();
+    input_lock();
     RemoveDevice(pDev, TRUE);
 
     if (!isMaster && pInfo != NULL) {
@@ -1078,7 +1078,7 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
         else
             xf86DeleteInput(pInfo, 0);
     }
-    OsReleaseSignals();
+    input_unlock();
 }
 
 /*
diff --git a/hw/xfree86/os-support/shared/sigio.c \
b/hw/xfree86/os-support/shared/sigio.c index c746d02..e0cd7a8 100644
--- a/hw/xfree86/os-support/shared/sigio.c
+++ b/hw/xfree86/os-support/shared/sigio.c
@@ -130,6 +130,26 @@ xf86IsPipe(int fd)
     return S_ISFIFO(buf.st_mode);
 }
 
+static void
+xf86BlockSIGIO(void)
+{
+    sigset_t set;
+
+    sigemptyset(&set);
+    sigaddset(&set, SIGIO);
+    sigprocmask(SIG_BLOCK, &set, NULL);
+}
+
+static void
+xf86ReleaseSIGIO(void)
+{
+    sigset_t set;
+
+    sigemptyset(&set);
+    sigaddset(&set, SIGIO);
+    sigprocmask(SIG_UNBLOCK, &set, NULL);
+}
+
 int
 xf86InstallSIGIOHandler(int fd, void (*f) (int, void *), void *closure)
 {
@@ -145,7 +165,7 @@ xf86InstallSIGIOHandler(int fd, void (*f) (int, void *), void \
*closure)  if (!xf86SigIOFuncs[i].f) {
             if (xf86IsPipe(fd))
                 return 0;
-            OsBlockSIGIO();
+            xf86BlockSIGIO();
 #ifdef O_ASYNC
             if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC) == -1) {
                 xf86Msg(X_WARNING, "fcntl(%d, O_ASYNC): %s\n",
@@ -173,7 +193,7 @@ xf86InstallSIGIOHandler(int fd, void (*f) (int, void *), void \
*closure)  }
 #endif
             if (!installed) {
-                OsReleaseSIGIO();
+                xf86ReleaseSIGIO();
                 return 0;
             }
             sigemptyset(&sa.sa_mask);
@@ -189,7 +209,7 @@ xf86InstallSIGIOHandler(int fd, void (*f) (int, void *), void \
*closure)  if (fd >= xf86SigIOMaxFd)
                 xf86SigIOMaxFd = fd + 1;
             FD_SET(fd, &xf86SigIOMask);
-            OsReleaseSIGIO();
+            xf86ReleaseSIGIO();
             return 1;
         }
         /* Allow overwriting of the closure and callback */
@@ -258,34 +278,3 @@ xf86RemoveSIGIOHandler(int fd)
     }
     return ret;
 }
-
-int
-xf86BlockSIGIO(void)
-{
-    return OsBlockSIGIO();
-}
-
-void
-xf86UnblockSIGIO(int wasset)
-{
-    OsReleaseSIGIO();
-}
-
-void
-xf86AssertBlockedSIGIO(char *where)
-{
-    sigset_t set, old;
-
-    sigemptyset(&set);
-    sigprocmask(SIG_BLOCK, &set, &old);
-    if (!sigismember(&old, SIGIO))
-        xf86Msg(X_ERROR, "SIGIO not blocked at %s\n", where);
-}
-
-/* XXX This is a quick hack for the benefit of xf86SetSilkenMouse() */
-
-int
-xf86SIGIOSupported(void)
-{
-    return 1;
-}
diff --git a/hw/xfree86/os-support/shared/sigiostubs.c \
b/hw/xfree86/os-support/shared/sigiostubs.c index ba8e234..d1792e8 100644
--- a/hw/xfree86/os-support/shared/sigiostubs.c
+++ b/hw/xfree86/os-support/shared/sigiostubs.c
@@ -45,26 +45,3 @@ xf86RemoveSIGIOHandler(int fd)
 {
     return 0;
 }
-
-int
-xf86BlockSIGIO(void)
-{
-    return 0;
-}
-
-void
-xf86UnblockSIGIO(int wasset)
-{
-}
-
-void
-xf86AssertBlockedSIGIO(char *where)
-{
-}
-
-/* XXX This is a quick hack for the benefit of xf86SetSilkenMouse() */
-Bool
-xf86SIGIOSupported()
-{
-    return FALSE;
-}
diff --git a/hw/xfree86/os-support/xf86_OSproc.h \
b/hw/xfree86/os-support/xf86_OSproc.h index fa3ff0e..99ca902 100644
--- a/hw/xfree86/os-support/xf86_OSproc.h
+++ b/hw/xfree86/os-support/xf86_OSproc.h
@@ -169,10 +169,6 @@ extern _X_EXPORT Bool xf86GARTCloseScreen(int screenNum);
 extern _X_EXPORT int xf86InstallSIGIOHandler(int fd, void (*f) (int, void *),
                                              void *);
 extern _X_EXPORT int xf86RemoveSIGIOHandler(int fd);
-extern _X_EXPORT int xf86BlockSIGIO(void);
-extern _X_EXPORT void xf86UnblockSIGIO(int);
-extern _X_EXPORT void xf86AssertBlockedSIGIO(char *);
-extern _X_EXPORT Bool xf86SIGIOSupported(void);
 
 #ifdef XF86_OS_PRIVS
 typedef void (*PMClose) (void);
diff --git a/include/input.h b/include/input.h
index d8bd9c6..75887b7 100644
--- a/include/input.h
+++ b/include/input.h
@@ -712,4 +712,13 @@ extern _X_HIDDEN void input_constrain_cursor(DeviceIntPtr pDev, \
ScreenPtr screen  int *out_x, int *out_y,
                                              int *nevents, InternalEvent* events);
 
+static inline void input_lock(void) {
+}
+
+static inline void input_unlock(void) {
+}
+
+static inline void input_force_unlock(void) {
+}
+
 #endif                          /* INPUT_H */
diff --git a/include/os.h b/include/os.h
index e7c1936..11f72a1 100644
--- a/include/os.h
+++ b/include/os.h
@@ -336,12 +336,6 @@ OsBlockSignals(void);
 extern _X_EXPORT void
 OsReleaseSignals(void);
 
-extern _X_EXPORT int
-OsBlockSIGIO(void);
-
-extern _X_EXPORT void
-OsReleaseSIGIO(void);
-
 extern void
 OsResetSignals(void);
 
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
index 7c03126..63dc5b3 100644
--- a/include/xorg-config.h.in
+++ b/include/xorg-config.h.in
@@ -127,9 +127,6 @@
 /* Path to text files containing PCI IDs */
 #undef PCI_TXT_IDS_PATH
 
-/* Use SIGIO handlers for input device events by default */
-#undef USE_SIGIO_BY_DEFAULT
-
 /* Build with libdrm support */
 #undef WITH_LIBDRM
 
diff --git a/mi/mieq.c b/mi/mieq.c
index 01812bd..8fbe6c3 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -145,10 +145,10 @@ mieqGrowQueue(EventQueuePtr eventQueue, size_t new_nevents)
 
     n_enqueued = mieqNumEnqueued(eventQueue);
 
-    /* We block signals, so an mieqEnqueue triggered by SIGIO does not
+    /* We lock input, so an mieqEnqueue does not
      * write to our queue as we are modifying it.
      */
-    OsBlockSignals();
+    input_lock();
 
     /* First copy the existing events */
     first_hunk = eventQueue->nevents - eventQueue->head;
@@ -181,7 +181,7 @@ mieqGrowQueue(EventQueuePtr eventQueue, size_t new_nevents)
     free(eventQueue->events);
     eventQueue->events = new_events;
 
-    OsReleaseSignals();
+    input_unlock();
     return TRUE;
 }
 
diff --git a/mi/mipointer.c b/mi/mipointer.c
index ada1ab5..587fe27 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -723,7 +723,7 @@ miPointerMove(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
                                POINTER_SCREEN | POINTER_ABSOLUTE |
                                POINTER_NORAW, &mask);
 
-    OsBlockSignals();
+    input_lock();
 #ifdef XQUARTZ
     darwinEvents_lock();
 #endif
@@ -732,5 +732,5 @@ miPointerMove(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 #ifdef XQUARTZ
     darwinEvents_unlock();
 #endif
-    OsReleaseSignals();
+    input_unlock();
 }
diff --git a/os/utils.c b/os/utils.c
index ef7a2cc..7e8891d 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -1304,9 +1304,7 @@ OsBlockSignals(void)
     if (BlockedSignalCount++ == 0) {
         sigset_t set;
 
-#ifdef SIGIO
-        OsBlockSIGIO();
-#endif
+        input_lock();
         sigemptyset(&set);
         sigaddset(&set, SIGALRM);
         sigaddset(&set, SIGVTALRM);
@@ -1322,57 +1320,13 @@ OsBlockSignals(void)
 #endif
 }
 
-#ifdef SIG_BLOCK
-static sig_atomic_t sigio_blocked;
-static sigset_t PreviousSigIOMask;
-#endif
-
-/**
- * returns zero if this call caused SIGIO to be blocked now, non-zero if it
- * was already blocked by a previous call to this function.
- */
-int
-OsBlockSIGIO(void)
-{
-#ifdef SIGIO
-#ifdef SIG_BLOCK
-    if (sigio_blocked++ == 0) {
-        sigset_t set;
-        int ret;
-
-        sigemptyset(&set);
-        sigaddset(&set, SIGIO);
-        sigprocmask(SIG_BLOCK, &set, &PreviousSigIOMask);
-        ret = sigismember(&PreviousSigIOMask, SIGIO);
-        return ret;
-    }
-#endif
-#endif
-    return 1;
-}
-
-void
-OsReleaseSIGIO(void)
-{
-#ifdef SIGIO
-#ifdef SIG_BLOCK
-    if (--sigio_blocked == 0) {
-        sigprocmask(SIG_SETMASK, &PreviousSigIOMask, 0);
-    } else if (sigio_blocked < 0) {
-        BUG_WARN(sigio_blocked < 0);
-        sigio_blocked = 0;
-    }
-#endif
-#endif
-}
-
 void
 OsReleaseSignals(void)
 {
 #ifdef SIG_BLOCK
     if (--BlockedSignalCount == 0) {
         sigprocmask(SIG_SETMASK, &PreviousSignalMask, 0);
-        OsReleaseSIGIO();
+        input_unlock();
     }
 #endif
 }
@@ -1383,10 +1337,7 @@ OsResetSignals(void)
 #ifdef SIG_BLOCK
     while (BlockedSignalCount > 0)
         OsReleaseSignals();
-#ifdef SIGIO
-    while (sigio_blocked > 0)
-        OsReleaseSIGIO();
-#endif
+    input_force_unlock();
 #endif
 }
 
diff --git a/test/Makefile.am b/test/Makefile.am
index d151b02..a92d7a6 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -5,7 +5,7 @@ if XORG
 # Tests that require at least some DDX functions in order to fully link
 # For now, requires xf86 ddx, could be adjusted to use another
 SUBDIRS += xi1 xi2
-noinst_PROGRAMS += xkb input xtest misc fixes xfree86 os signal-logging touch
+noinst_PROGRAMS += xkb input xtest misc fixes xfree86 signal-logging touch
 if RES
 noinst_PROGRAMS += hashtabletest
 endif
diff --git a/test/os.c b/test/os.c
deleted file mode 100644
index d85dcff..0000000
--- a/test/os.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * Copyright  © 2012 Red Hat, Inc.
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),
- *  to deal in the Software without restriction, including without limitation
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- *  Software is furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice (including the next
- *  paragraph) shall be included in all copies or substantial portions of the
- *  Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *  DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <signal.h>
-#include "os.h"
-
-static int last_signal = 0;
-static int expect_signal = 0;
-
-static void sighandler(int signal)
-{
-    assert(expect_signal);
-    expect_signal = 0;
-    if (!last_signal)
-        raise(signal);
-    OsBlockSignals();
-    OsReleaseSignals();
-    last_signal = 1;
-    expect_signal = 1;
-}
-
-static int
-sig_is_blocked(int sig)
-{
-    sigset_t current;
-
-    sigemptyset(&current);
-    assert(sigprocmask(SIG_BLOCK, NULL, &current) == 0);
-    return sigismember(&current, sig);
-}
-
-static void block_sigio_test(void)
-{
-#ifdef SIG_BLOCK
-    sigset_t current;
-
-    sigemptyset(&current);
-    assert(!sig_is_blocked(SIGIO));
-
-    /* block once */
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* block twice, nested */
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* block all */
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* block all nested */
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* mix the two */
-    /* ABBA */
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* ABAB */
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* BAAB */
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(!sig_is_blocked(SIGIO));
-
-    /* BABA */
-    OsBlockSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsBlockSignals();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSIGIO();
-    assert(sig_is_blocked(SIGIO));
-    OsReleaseSignals();
-    assert(!sig_is_blocked(SIGIO));
-#endif
-}
-
-static void block_sigio_test_nested(void)
-{
-#ifdef SIG_BLOCK
-    /* Check for bug releasing SIGIO during SIGIO signal handling.
-       test case:
-           raise signal
-           → in signal handler:
-                raise signal
-                OsBlockSignals()
-                OsReleaseSignals()
-                tail guard
-       tail guard must be hit.
-     */
-    void (*old_handler)(int);
-    old_handler = OsSignal(SIGIO, sighandler);
-    expect_signal = 1;
-    assert(raise(SIGIO) == 0);
-    assert(OsSignal(SIGIO, old_handler) == sighandler);
-#endif
-}
-
-int
-main(int argc, char **argv)
-{
-    block_sigio_test();
-    block_sigio_test_nested();
-    return 0;
-}
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index aeb702c..afe5edf 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -1526,7 +1526,7 @@ InjectPointerKeyEvents(DeviceIntPtr dev, int type, int button, \
int flags,  return;
 
     events = InitEventList(GetMaximumEventsNum() + 1);
-    OsBlockSignals();
+    input_lock();
     pScreen = miPointerGetScreen(ptr);
     saveWait = miPointerSetWaitForUpdate(pScreen, FALSE);
     nevents = GetPointerEvents(events, ptr, type, button, flags, mask);
@@ -1534,7 +1534,7 @@ InjectPointerKeyEvents(DeviceIntPtr dev, int type, int button, \
                int flags,
         UpdateFromMaster(&events[nevents], lastSlave, DEVCHANGE_POINTER_EVENT,
                          &nevents);
     miPointerSetWaitForUpdate(pScreen, saveWait);
-    OsReleaseSignals();
+    input_unlock();
 
     for (i = 0; i < nevents; i++)
         mieqProcessDeviceEvent(ptr, &events[i], NULL);
-- 
2.6.4



-- 
-keith

["signature.asc" (application/pgp-signature)]
[Attachment #10 (text/plain)]

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic