[PATCH xserver 2/8] Remove SIGIO support for input [v2]

Keith Packard keithp at keithp.com
Wed Dec 9 15:12:36 PST 2015


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)

Signed-off-by: Keith Packard <keithp at 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            |  32 +++---
 hw/xfree86/common/xf86Helper.c            |   2 +-
 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                           |   3 +
 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, 103 insertions(+), 464 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..df8c7b6 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,18 +291,16 @@ 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;
 
     pInfo->read_input(pInfo);
-
-    errno = errno_save;
 }
 
 /*
@@ -312,9 +310,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 +320,7 @@ xf86AddEnabledDevice(InputInfoPtr pInfo)
 void
 xf86RemoveEnabledDevice(InputInfoPtr pInfo)
 {
-    if (!xf86RemoveSIGIOHandler(pInfo->fd)) {
-        RemoveEnabledDevice(pInfo->fd);
-    }
+    RemoveNotifyFd(pInfo->fd);
 }
 
 static int *xf86SignalIntercept = NULL;
@@ -402,9 +396,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 +481,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 +539,7 @@ switch_failed:
         else
             xf86EnableGeneralHandler(ih);
     }
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 void
@@ -603,7 +597,7 @@ xf86VTEnter(void)
 
     xf86UpdateHasVTProperty(TRUE);
 
-    OsReleaseSIGIO();
+    input_unlock();
 }
 
 /*
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index c42e93e..b506338 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -1729,7 +1729,7 @@ xf86SetSilkenMouse(ScreenPtr pScreen)
      * yet.  Should handle this differently so that alternate async methods
      * work correctly with this too.
      */
-    pScrn->silkenMouse = useSM && xf86Info.useSIGIO && xf86SIGIOSupported();
+    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 5bc60f0..75887b7 100644
--- a/include/input.h
+++ b/include/input.h
@@ -718,4 +718,7 @@ 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.2




More information about the xorg-devel mailing list