xserver: Branch 'master' - 5 commits

Adam Jackson ajax at kemper.freedesktop.org
Wed Jun 8 15:41:00 UTC 2016


 Xext/shm.c                              |    5 
 Xext/xf86bigfont.c                      |    6 
 hw/dmx/dmxinput.h                       |   18 --
 hw/dmx/doc/dmx.xml                      |   11 -
 hw/dmx/input/Makefile.am                |    2 
 hw/dmx/input/dmxevents.c                |    5 
 hw/dmx/input/dmxinputinit.c             |    9 -
 hw/dmx/input/dmxsigio.c                 |  234 --------------------------------
 hw/dmx/input/dmxsigio.h                 |   43 -----
 hw/dmx/input/lnx-keyboard.c             |    7 
 hw/dmx/input/lnx-ms.c                   |    2 
 hw/dmx/input/lnx-ps2.c                  |    2 
 hw/dmx/input/usb-common.c               |    2 
 hw/dmx/input/usb-keyboard.c             |    2 
 hw/kdrive/ephyr/ephyr.h                 |    1 
 hw/kdrive/linux/linux.c                 |    1 
 hw/kdrive/src/kdrive.c                  |    2 
 hw/kdrive/src/kinput.c                  |    1 
 hw/xfree86/common/xf86Init.c            |   18 +-
 hw/xfree86/common/xf86Privstr.h         |    3 
 hw/xfree86/common/xf86str.h             |    2 
 hw/xfree86/dri/dri.c                    |  133 ++++++++----------
 hw/xfree86/dri/dri.h                    |    3 
 hw/xfree86/man/xorg.conf.man            |    9 -
 hw/xfree86/os-support/bsd/bsd_init.c    |    2 
 hw/xfree86/os-support/linux/lnx_init.c  |    2 
 hw/xfree86/os-support/shared/VTsw_usl.c |    2 
 hw/xfree86/parser/write.c               |    5 
 include/globals.h                       |    2 
 mi/mieq.c                               |    3 
 mi/mipointer.c                          |    5 
 mi/mipointrst.h                         |    2 
 os/utils.c                              |    4 
 33 files changed, 103 insertions(+), 445 deletions(-)

New commits:
commit 5bcdd1cc753d8e60c249eeacba695653af1a39d8
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 7 15:52:15 2016 -0400

    dix: Update some comments to reflect the new non-SIGIO input model
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/dmx/doc/dmx.xml b/hw/dmx/doc/dmx.xml
index 40b9e42..f10cf79 100644
--- a/hw/dmx/doc/dmx.xml
+++ b/hw/dmx/doc/dmx.xml
@@ -944,14 +944,9 @@ are missing.
 <title>devReadInput()</title>
 
 <para>Each device will have some function that gets called to read its
-physical input.  These may be called in a number of different ways.  In
-the case of synchronous I/O, they will be called from a DDX
-wakeup-handler that gets called after the server detects that new input is
-available.  In the case of asynchronous I/O, they will be called from a
-(SIGIO) signal handler triggered when new input is available.  This
-function should do at least two things: make sure that input events get
-enqueued, and make sure that the cursor gets moved for motion events
-(except if these are handled later by the driver's own event queue
+physical input. This function should do at least two things: make sure that
+input events get enqueued, and make sure that the cursor gets moved for motion
+events (except if these are handled later by the driver's own event queue
 processing function, which cannot be done when using the MI event queue
 handling).
 </para>
diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c
index 235ba21..fb0c00f 100644
--- a/hw/dmx/input/dmxevents.c
+++ b/hw/dmx/input/dmxevents.c
@@ -585,7 +585,7 @@ dmxInvalidateGlobalPosition(void)
  * \a DMX_ABSOLUTE_CONFINED (in the latter case, the pointer will not be
  * allowed to move outside the global boundaires).
  *
- * If \a block is set to \a DMX_BLOCK, then the SIGIO handler will be
+ * If \a block is set to \a DMX_BLOCK, then the input thread will be
  * blocked around calls to \a enqueueMotion(). */
 void
 dmxMotion(DevicePtr pDev, int *v, int firstAxes, int axesCount,
@@ -689,7 +689,7 @@ dmxFixup(DevicePtr pDev, int detail, KeySym keySym)
  * KeyRelease event, then the \a keySym is also specified.
  *
  * FIXME: make the code do what the comment says, or remove this comment.
- * If \a block is set to \a DMX_BLOCK, then the SIGIO handler will be
+ * If \a block is set to \a DMX_BLOCK, then the input thread will be
  * blocked around calls to dmxeqEnqueue(). */
 
 void
diff --git a/hw/dmx/input/lnx-keyboard.c b/hw/dmx/input/lnx-keyboard.c
index 2a5ce79..a273f6b 100644
--- a/hw/dmx/input/lnx-keyboard.c
+++ b/hw/dmx/input/lnx-keyboard.c
@@ -820,7 +820,7 @@ kbdLinuxConvert(DevicePtr pDev,
  * event, enqueue it with the \a motion function.  Otherwise, check for
  * special keys with the \a checkspecial function and enqueue the event
  * with the \a enqueue function.  The \a block type is passed to the
- * functions so that they may block SIGIO handling as appropriate to the
+ * functions so that they may block the input thread as appropriate to the
  * caller of this function. */
 void
 kbdLinuxRead(DevicePtr pDev,
diff --git a/hw/dmx/input/lnx-ms.c b/hw/dmx/input/lnx-ms.c
index 621f0fe..cb3b25f 100644
--- a/hw/dmx/input/lnx-ms.c
+++ b/hw/dmx/input/lnx-ms.c
@@ -191,7 +191,7 @@ msLinuxButton(DevicePtr pDev, ENQUEUEPROC enqueue, int buttons, BLOCK block)
  * event, enqueue it with the \a motion function.  Otherwise, check for
  * special keys with the \a checkspecial function and enqueue the event
  * with the \a enqueue function.  The \a block type is passed to the
- * functions so that they may block SIGIO handling as appropriate to the
+ * functions so that they may block the input thread as appropriate to the
  * caller of this function. */
 void
 msLinuxRead(DevicePtr pDev,
diff --git a/hw/dmx/input/lnx-ps2.c b/hw/dmx/input/lnx-ps2.c
index dd70cb8..9041974 100644
--- a/hw/dmx/input/lnx-ps2.c
+++ b/hw/dmx/input/lnx-ps2.c
@@ -187,7 +187,7 @@ ps2LinuxButton(DevicePtr pDev, ENQUEUEPROC enqueue, int buttons, BLOCK block)
  * event, enqueue it with the \a motion function.  Otherwise, check for
  * special keys with the \a checkspecial function and enqueue the event
  * with the \a enqueue function.  The \a block type is passed to the
- * functions so that they may block SIGIO handling as appropriate to the
+ * functions so that they may block the input thread as appropriate to the
  * caller of this function. */
 void
 ps2LinuxRead(DevicePtr pDev, MOTIONPROC motion,
diff --git a/hw/dmx/input/usb-common.c b/hw/dmx/input/usb-common.c
index 67aa07e..8c62aba 100644
--- a/hw/dmx/input/usb-common.c
+++ b/hw/dmx/input/usb-common.c
@@ -77,7 +77,7 @@
 /** Read an event from the \a pDev device.  If the event is a motion
  * event, enqueue it with the \a motion function.  Otherwise, enqueue
  * the event with the \a enqueue function.  The \a block type is passed
- * to the functions so that they may block SIGIO handling as appropriate
+ * to the functions so that they may block the input thread as appropriate
  * to the caller of this function.
  *
  * Since USB devices return EV_KEY events for buttons and keys, \a
diff --git a/hw/dmx/input/usb-keyboard.c b/hw/dmx/input/usb-keyboard.c
index 65bfcd0..e41ad40 100644
--- a/hw/dmx/input/usb-keyboard.c
+++ b/hw/dmx/input/usb-keyboard.c
@@ -379,7 +379,7 @@ kbdUSBConvert(DevicePtr pDev,
  * event, enqueue it with the \a motion function.  Otherwise, check for
  * special keys with the \a checkspecial function and enqueue the event
  * with the \a enqueue function.  The \a block type is passed to the
- * functions so that they may block SIGIO handling as appropriate to the
+ * functions so that they may block the input thread as appropriate to the
  * caller of this function. */
 void
 kbdUSBRead(DevicePtr pDev,
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index 2951983..9e327b9 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -80,8 +80,7 @@ typedef struct {
     Bool miscModInDevEnabled;   /* Allow input devices to be
                                  * changed */
     Bool miscModInDevAllowNonLocal;
-    Bool useSIGIO;              /* Use SIGIO for handling
-                                   input device events */
+    Bool useSIGIO;              /* Use SIGIO for handling DRI1 swaps */
     Pix24Flags pixmap24;
     MessageType pix24From;
     Bool pmFlag;
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index 5e6e977..bfcb75e 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -678,7 +678,7 @@ typedef struct _ScrnInfoRec {
     /* Allow screens to be enabled/disabled individually */
     Bool vtSema;
 
-    /* hw cursor moves at SIGIO time */
+    /* hw cursor moves from input thread */
     Bool silkenMouse;
 
     /* Storage for clockRanges and adjustFlags for use with the VidMode ext */
diff --git a/mi/mieq.c b/mi/mieq.c
index f2db5a6..05447d6 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -239,8 +239,7 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
     else if (n_enqueued + 1 == miEventQueue.nevents) {
         if (!mieqGrowQueue(&miEventQueue, miEventQueue.nevents << 1)) {
             /* Toss events which come in late.  Usually this means your server's
-             * stuck in an infinite loop somewhere, but SIGIO is still getting
-             * handled.
+             * stuck in an infinite loop in the main thread.
              */
             miEventQueue.dropped++;
             if (miEventQueue.dropped == 1) {
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 3f6252d..01f3bd2 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -555,8 +555,9 @@ miPointerMoveNoEvent(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
     pPointer = MIPOINTER(pDev);
 
     /* Hack: We mustn't call into ->MoveCursor for anything but the
-     * VCP, as this may cause a non-HW rendered cursor to be rendered during
-     * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
+     * VCP, as this may cause a non-HW rendered cursor to be rendered while
+     * not holding the input lock. This would race with building the command
+     * buffer for other rendering.
      */
     if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer
         &&!pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen) {
diff --git a/mi/mipointrst.h b/mi/mipointrst.h
index 4319b12..7419ac1 100644
--- a/mi/mipointrst.h
+++ b/mi/mipointrst.h
@@ -38,7 +38,7 @@ typedef struct {
     miPointerSpriteFuncPtr spriteFuncs; /* sprite-specific methods */
     miPointerScreenFuncPtr screenFuncs; /* screen-specific methods */
     CloseScreenProcPtr CloseScreen;
-    Bool waitForUpdate;         /* don't move cursor in SIGIO */
+    Bool waitForUpdate;         /* don't move cursor from input thread */
     Bool showTransparent;       /* show empty cursors */
 } miPointerScreenRec, *miPointerScreenPtr;
 #endif                          /* MIPOINTRST_H */
commit 48a9b29b0a09b865492d60e8a7cd2a94864fbb3f
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 7 15:52:14 2016 -0400

    xfree86: Undocument UseSIGIO in xorg.conf
    
    The doc text is wrong at this point, input processing isn't going to
    vary based on this, so we shouldn't say it does. The only thing this
    _does_ get used for is DRI1 SwapBuffers (on everything but savage), and
    if you disable it you're not going to get DRI1 at all, so we really
    shouldn't even mention it.
    
    Still, leave the option wired up to the parser so we don't break any
    DRI1-driver-using setup relying on it being disabled, and so we don't
    complain about unused options elsewhere.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
index 8693cab..94b199e 100644
--- a/hw/xfree86/man/xorg.conf.man
+++ b/hw/xfree86/man/xorg.conf.man
@@ -511,15 +511,6 @@ core file.
 In general you never want to use this option unless you are debugging an Xorg
 server problem and know how to deal with the consequences.
 .TP 7
-.BI "Option \*qUseSIGIO\*q  \*q" boolean \*q
-This controls whether the Xorg server requests that events from
-input devices be reported via a SIGIO signal handler (also known as SIGPOLL
-on some platforms), or only reported via the standard select(3) loop.
-The default behaviour is platform specific.   In general you do not want to
-use this option unless you are debugging the Xorg server, or
-working around a specific bug until it is fixed, and understand the
-consequences.
-.TP 7
 .BI "Option \*qDontVTSwitch\*q  \*q" boolean \*q
 This disallows the use of the
 .BI Ctrl+Alt+F n
commit 2725dd024de33e96555cbf6ff28184a64d515c3c
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 7 15:52:13 2016 -0400

    dri1: Hide the SIGIO details from drivers
    
    Not being used, and not likely to be useful.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index 0046e52..dbad12f 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -310,6 +310,68 @@ dri_crtc_notify(ScreenPtr pScreen)
         xf86_wrap_crtc_notify(pScreen, dri_crtc_notify);
 }
 
+static void
+drmSIGIOHandler(int interrupt, void *closure)
+{
+    unsigned long key;
+    void *value;
+    ssize_t count;
+    drm_ctx_t ctx;
+    typedef void (*_drmCallback) (int, void *, void *);
+    char buf[256];
+    drm_context_t old;
+    drm_context_t new;
+    void *oldctx;
+    void *newctx;
+    char *pt;
+    drmHashEntry *entry;
+    void *hash_table;
+
+    hash_table = drmGetHashTable();
+
+    if (!hash_table)
+        return;
+    if (drmHashFirst(hash_table, &key, &value)) {
+        entry = value;
+        do {
+            if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
+                buf[count] = '\0';
+
+                for (pt = buf; *pt != ' '; ++pt);       /* Find first space */
+                ++pt;
+                old = strtol(pt, &pt, 0);
+                new = strtol(pt, NULL, 0);
+                oldctx = drmGetContextTag(entry->fd, old);
+                newctx = drmGetContextTag(entry->fd, new);
+                ((_drmCallback) entry->f) (entry->fd, oldctx, newctx);
+                ctx.handle = new;
+                ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
+            }
+        } while (drmHashNext(hash_table, &key, &value));
+    }
+}
+
+static int
+drmInstallSIGIOHandler(int fd, void (*f) (int, void *, void *))
+{
+    drmHashEntry *entry;
+
+    entry = drmGetEntry(fd);
+    entry->f = f;
+
+    return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
+}
+
+static int
+drmRemoveSIGIOHandler(int fd)
+{
+    drmHashEntry *entry = drmGetEntry(fd);
+
+    entry->f = NULL;
+
+    return xf86RemoveSIGIOHandler(fd);
+}
+
 Bool
 DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
 {
@@ -2378,74 +2440,3 @@ DRICreatePCIBusID(const struct pci_device *dev)
 
     return busID;
 }
-
-static void
-drmSIGIOHandler(int interrupt, void *closure)
-{
-    unsigned long key;
-    void *value;
-    ssize_t count;
-    drm_ctx_t ctx;
-    typedef void (*_drmCallback) (int, void *, void *);
-    char buf[256];
-    drm_context_t old;
-    drm_context_t new;
-    void *oldctx;
-    void *newctx;
-    char *pt;
-    drmHashEntry *entry;
-    void *hash_table;
-
-    hash_table = drmGetHashTable();
-
-    if (!hash_table)
-        return;
-    if (drmHashFirst(hash_table, &key, &value)) {
-        entry = value;
-        do {
-#if 0
-            fprintf(stderr, "Trying %d\n", entry->fd);
-#endif
-            if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
-                buf[count] = '\0';
-#if 0
-                fprintf(stderr, "Got %s\n", buf);
-#endif
-
-                for (pt = buf; *pt != ' '; ++pt);       /* Find first space */
-                ++pt;
-                old = strtol(pt, &pt, 0);
-                new = strtol(pt, NULL, 0);
-                oldctx = drmGetContextTag(entry->fd, old);
-                newctx = drmGetContextTag(entry->fd, new);
-#if 0
-                fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
-#endif
-                ((_drmCallback) entry->f) (entry->fd, oldctx, newctx);
-                ctx.handle = new;
-                ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
-            }
-        } while (drmHashNext(hash_table, &key, &value));
-    }
-}
-
-int
-drmInstallSIGIOHandler(int fd, void (*f) (int, void *, void *))
-{
-    drmHashEntry *entry;
-
-    entry = drmGetEntry(fd);
-    entry->f = f;
-
-    return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
-}
-
-int
-drmRemoveSIGIOHandler(int fd)
-{
-    drmHashEntry *entry = drmGetEntry(fd);
-
-    entry->f = NULL;
-
-    return xf86RemoveSIGIOHandler(fd);
-}
diff --git a/hw/xfree86/dri/dri.h b/hw/xfree86/dri/dri.h
index 1ce0970..7e0337f 100644
--- a/hw/xfree86/dri/dri.h
+++ b/hw/xfree86/dri/dri.h
@@ -332,9 +332,6 @@ extern _X_EXPORT void DRIMoveBuffersHelper(ScreenPtr pScreen,
 
 extern _X_EXPORT char *DRICreatePCIBusID(const struct pci_device *PciInfo);
 
-extern _X_EXPORT int drmInstallSIGIOHandler(int fd,
-                                            void (*f) (int, void *, void *));
-extern _X_EXPORT int drmRemoveSIGIOHandler(int fd);
 extern _X_EXPORT int DRIMasterFD(ScrnInfoPtr pScrn);
 
 extern _X_EXPORT void *DRIMasterSareaPointer(ScrnInfoPtr pScrn);
commit 95ce2bccdcdc88355262674a636c342c946914da
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 7 15:52:12 2016 -0400

    dmx: Remove SIGIO input support here too
    
    This code was broken anyway. Note that DEVICE_OFF would make dmx think
    _no_ devices were using SIGIO anymore, which means 'xinput disable' on
    your mouse would probably do weird things to your keyboard too. Rather
    than try to repair that and keep SIGIO working on this one niche DDX,
    just rip it out and use the thread model like everyone else.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/dmx/dmxinput.h b/hw/dmx/dmxinput.h
index 83c9c8b..210fd7a 100644
--- a/hw/dmx/dmxinput.h
+++ b/hw/dmx/dmxinput.h
@@ -47,9 +47,6 @@
 #ifndef DMXINPUT_H
 #define DMXINPUT_H
 
-/** Maximum number of file descriptors for SIGIO handling */
-#define DMX_MAX_SIGIO_FDS 4
-
 struct _DMXInputInfo;
 
 /** Reason why window layout was updated. */
@@ -69,15 +66,6 @@ typedef void (*UpdateWindowInfoProc) (struct _DMXInputInfo *,
 /** An opaque structure that is only exposed in the dmx/input layer. */
 typedef struct _DMXLocalInputInfo *DMXLocalInputInfoPtr;
 
-/** State of the SIGIO engine */
-typedef enum {
-    DMX_NOSIGIO = 0,            /**< Device does not use SIGIO at all. */
-    DMX_USESIGIO,               /**< Device can use SIGIO, but is not
-                                 * (e.g., because the VT is switch
-                                 * away). */
-    DMX_ACTIVESIGIO             /**< Device is currently using SIGIO. */
-} dmxSigioState;
-
 /** DMXInputInfo is typedef'd in \a dmx.h so that all routines can have
  * access to the global pointers.  However, the elements are only
  * available to input-related routines. */
@@ -102,12 +90,6 @@ struct _DMXInputInfo {
     ProcessInputEventsProc processInputEvents;
     UpdateWindowInfoProc updateWindowInfo;
 
-    /* Local input information */
-    dmxSigioState sigioState;              /**< Current stat */
-    int sigioFdCount;                      /**< Number of fds in use */
-    int sigioFd[DMX_MAX_SIGIO_FDS];                        /**< List of fds */
-    Bool sigioAdded[DMX_MAX_SIGIO_FDS];                    /**< Active fds */
-
     /** True if a VT switch is pending, but has not yet happened. */
     int vt_switch_pending;
 
diff --git a/hw/dmx/input/Makefile.am b/hw/dmx/input/Makefile.am
index 185aaf8..b56ee8e 100644
--- a/hw/dmx/input/Makefile.am
+++ b/hw/dmx/input/Makefile.am
@@ -34,8 +34,6 @@ DMXSRCS = dmxinputinit.c \
           dmxinputinit.h \
           dmxarg.c \
           dmxarg.h \
-          dmxsigio.c \
-          dmxsigio.h \
           dmxevents.c \
           dmxevents.h \
 	  dmxxinput.c \
diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c
index 3789602..235ba21 100644
--- a/hw/dmx/input/dmxevents.c
+++ b/hw/dmx/input/dmxevents.c
@@ -47,7 +47,6 @@
 #include "dmxcommon.h"
 #include "dmxcursor.h"
 #include "dmxmotion.h"
-#include "dmxsigio.h"
 #include "dmxmap.h"
 
 #include <X11/keysym.h>
diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index cdefd9a..a9522ff 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -63,7 +63,6 @@
 #include "usb-other.h"
 #include "usb-common.h"
 
-#include "dmxsigio.h"
 #include "dmxarg.h"
 
 #include "inputstr.h"
@@ -434,7 +433,6 @@ static int
 dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
 {
     GETDMXINPUTFROMPDEVICE;
-    int fd;
     DMXLocalInitInfo info;
     int i;
     Atom btn_labels[MAX_BUTTONS] = { 0 };       /* FIXME */
@@ -523,8 +521,8 @@ dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
         break;
     case DEVICE_ON:
         if (!pDev->on) {
-            if (dmxLocal->on && (fd = dmxLocal->on(pDev)) >= 0)
-                dmxSigioRegister(dmxInput, fd);
+            if (dmxLocal->on)
+		dmxLocal->on(pDev);
             pDev->on = TRUE;
         }
         break;
@@ -534,7 +532,6 @@ dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
          * detached screen (DEVICE_OFF), and then again at server
          * generation time (DEVICE_CLOSE). */
         if (pDev->on) {
-            dmxSigioUnregister(dmxInput);
             if (dmxLocal->off)
                 dmxLocal->off(pDev);
             pDev->on = FALSE;
@@ -654,7 +651,6 @@ dmxSwitchReturn(void *p)
 
     if (!dmxInput->vt_switched)
         dmxLog(dmxFatal, "dmxSwitchReturn called, but not switched\n");
-    dmxSigioEnableInput();
     for (i = 0; i < dmxInput->numDevs; i++)
         if (dmxInput->devs[i]->vt_post_switch)
             dmxInput->devs[i]->vt_post_switch(dmxInput->devs[i]->private);
@@ -676,7 +672,6 @@ dmxWakeupHandler(void *blockData, int result, void *pReadMask)
         dmxInput->vt_switch_pending = 0;
         for (i = 0; i < dmxInput->numDevs; i++) {
             if (dmxInput->devs[i]->vt_switch) {
-                dmxSigioDisableInput();
                 if (!dmxInput->devs[i]->vt_switch(dmxInput->devs[i]->private,
                                                   dmxInput->vt_switched,
                                                   dmxSwitchReturn, dmxInput))
diff --git a/hw/dmx/input/dmxsigio.c b/hw/dmx/input/dmxsigio.c
deleted file mode 100644
index ebfd3d9..0000000
--- a/hw/dmx/input/dmxsigio.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright 2002-2003 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * 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 on 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
- * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * 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.
- */
-
-/*
- * Authors:
- *   Rickard E. (Rik) Faith <faith at redhat.com>
- *
- */
-
-/** \file
- *
- * Provides an interface for handling SIGIO signals for input devices. */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "inputstr.h"
-#include "dmxinputinit.h"
-#include "dmxsigio.h"
-#include "dmxevents.h"
-#include <signal.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-static int dmxFdCount = 0;
-static Bool dmxInputEnabled = TRUE;
-
-/* Define equivalents for non-POSIX systems (e.g., SGI IRIX, Solaris) */
-#ifndef O_ASYNC
-#ifdef FASYNC
-#define O_ASYNC FASYNC
-#else
-#define O_ASYNC 0
-#endif
-#endif
-#ifndef O_NONBLOCK
-#define O_NONBLOCK FNONBLK
-#endif
-
-static void
-dmxSigioHandler(int sig)
-{
-    int i, j;
-    DMXInputInfo *dmxInput;
-
-    for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++) {
-        if (dmxInput->sigioState == DMX_ACTIVESIGIO) {
-            for (j = 0; j < dmxInput->numDevs; j++) {
-                DMXLocalInputInfoPtr dmxLocal = dmxInput->devs[j];
-
-                if (dmxLocal->collect_events) {
-                    dmxLocal->collect_events(&dmxLocal->pDevice->public,
-                                             dmxMotion,
-                                             dmxEnqueue,
-                                             dmxCheckSpecialKeys, DMX_NO_BLOCK);
-                }
-            }
-        }
-    }
-}
-
-static void
-dmxSigioHook(void)
-{
-    struct sigaction a;
-    sigset_t s;
-
-    memset(&a, 0, sizeof(a));
-    a.sa_handler = dmxSigioHandler;
-    sigemptyset(&a.sa_mask);
-    sigaddset(&a.sa_mask, SIGIO);
-    sigaddset(&a.sa_mask, SIGALRM);
-    sigaddset(&a.sa_mask, SIGVTALRM);
-    sigaction(SIGIO, &a, 0);
-
-    sigemptyset(&s);
-    xthread_sigmask(SIG_SETMASK, &s, 0);
-}
-
-static void
-dmxSigioUnhook(void)
-{
-    struct sigaction a;
-
-    memset(&a, 0, sizeof(a));
-    a.sa_handler = SIG_IGN;
-    sigemptyset(&a.sa_mask);
-    sigaction(SIGIO, &a, 0);
-}
-
-static void
-dmxSigioAdd(DMXInputInfo * dmxInput)
-{
-    int flags;
-    int i;
-
-    switch (dmxInput->sigioState) {
-    case DMX_NOSIGIO:
-        return;
-    case DMX_USESIGIO:
-        dmxInput->sigioState = DMX_ACTIVESIGIO;
-        break;
-    case DMX_ACTIVESIGIO:
-        return;
-    }
-
-    for (i = 0; i < dmxInput->sigioFdCount; i++) {
-        if (!dmxInput->sigioAdded[i]) {
-            int fd = dmxInput->sigioFd[i];
-
-            fcntl(fd, F_SETOWN, getpid());
-            flags = fcntl(fd, F_GETFL);
-            flags |= O_ASYNC | O_NONBLOCK;
-            fcntl(fd, F_SETFL, flags);
-
-            AddEnabledDevice(fd);
-            dmxInput->sigioAdded[i] = TRUE;
-
-            if (++dmxFdCount == 1)
-                dmxSigioHook();
-        }
-    }
-}
-
-static void
-dmxSigioRemove(DMXInputInfo * dmxInput)
-{
-    int flags;
-    int i;
-
-    switch (dmxInput->sigioState) {
-    case DMX_NOSIGIO:
-        return;
-    case DMX_USESIGIO:
-        return;
-    case DMX_ACTIVESIGIO:
-        dmxInput->sigioState = DMX_USESIGIO;
-        break;
-    }
-
-    for (i = 0; i < dmxInput->sigioFdCount; i++) {
-        if (dmxInput->sigioAdded[i]) {
-            int fd = dmxInput->sigioFd[i];
-
-            dmxInput->sigioAdded[i] = FALSE;
-            RemoveEnabledDevice(fd);
-
-            flags = fcntl(fd, F_GETFL);
-            flags &= ~(O_ASYNC | O_NONBLOCK);
-            fcntl(fd, F_SETFL, flags);
-
-            if (!--dmxFdCount)
-                dmxSigioUnhook();
-        }
-    }
-}
-
-/** Enable SIGIO handling.  This instantiates the handler with the OS. */
-void
-dmxSigioEnableInput(void)
-{
-    int i;
-    DMXInputInfo *dmxInput;
-
-    dmxInputEnabled = TRUE;
-    for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++)
-        dmxSigioAdd(dmxInput);
-}
-
-/** Disable SIGIO handling.  This removes the hanlder from the OS. */
-void
-dmxSigioDisableInput(void)
-{
-    int i;
-    DMXInputInfo *dmxInput;
-
-    dmxInputEnabled = FALSE;
-    for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++)
-        dmxSigioRemove(dmxInput);
-}
-
-/** Make a note that the input device described in \a dmxInput will be
- * using the file descriptor \a fd for SIGIO signals.  Calls
- * AddEnabledDevice ifi SIGIO handling has been enabled with
- * #dmxSigioEnableInput(). */
-void
-dmxSigioRegister(DMXInputInfo * dmxInput, int fd)
-{
-    dmxInput->sigioState = DMX_USESIGIO;
-    if (dmxInput->sigioFdCount >= DMX_MAX_SIGIO_FDS)
-        dmxLog(dmxFatal, "Too many SIGIO file descriptors (%d >= %d)\n",
-               dmxInput->sigioFdCount, DMX_MAX_SIGIO_FDS);
-
-    dmxInput->sigioFd[dmxInput->sigioFdCount++] = fd;
-    if (dmxInputEnabled)
-        dmxSigioAdd(dmxInput);
-}
-
-/** Remove the notes that \a dmxInput is using any file descriptors for
- * SIGIO signals.  Calls RemoveEnabledDevice. */
-void
-dmxSigioUnregister(DMXInputInfo * dmxInput)
-{
-    if (dmxInput->sigioState == DMX_NOSIGIO)
-        return;
-    dmxSigioRemove(dmxInput);
-    dmxInput->sigioState = DMX_NOSIGIO;
-    dmxInput->sigioFdCount = 0;
-}
diff --git a/hw/dmx/input/dmxsigio.h b/hw/dmx/input/dmxsigio.h
deleted file mode 100644
index 9f30662..0000000
--- a/hw/dmx/input/dmxsigio.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2001 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * 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 on 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
- * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * 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.
- */
-
-/*
- * Authors:
- *   Rickard E. (Rik) Faith <faith at redhat.com>
- *
- */
-
-/** \file
- * Interface to SIGIO handling support.  \see dmxsigio.c */
-
-#ifndef _DMXSIGIO_H_
-#define _DMXSIGIO_H_
-extern void dmxSigioEnableInput(void);
-extern void dmxSigioDisableInput(void);
-extern void dmxSigioRegister(DMXInputInfo * dmxInput, int fd);
-extern void dmxSigioUnregister(DMXInputInfo * dmxInput);
-#endif
commit 6178b1c91cfc9e860914acc6f0be2f2d2e07a124
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 7 15:52:11 2016 -0400

    dix: Use OsSignal() not signal()
    
    As the man page for the latter states:
    
        The effects of signal() in a multithreaded process are unspecified.
    
    We already have an interface to call sigaction() instead, use it.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/Xext/shm.c b/Xext/shm.c
index b359a90..0a44b76 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -153,7 +153,6 @@ static ShmFuncs fbFuncs = { fbShmCreatePixmap, NULL };
 }
 
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
-#include <sys/signal.h>
 
 static Bool badSysCall = FALSE;
 
@@ -170,7 +169,7 @@ CheckForShmSyscall(void)
     int shmid = -1;
 
     /* If no SHM support in the kernel, the bad syscall will generate SIGSYS */
-    oldHandler = signal(SIGSYS, SigSysHandler);
+    oldHandler = OsSignal(SIGSYS, SigSysHandler);
 
     badSysCall = FALSE;
     shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT);
@@ -183,7 +182,7 @@ CheckForShmSyscall(void)
         /* Allocation failed */
         badSysCall = TRUE;
     }
-    signal(SIGSYS, oldHandler);
+    OsSignal(SIGSYS, oldHandler);
     return !badSysCall;
 }
 
diff --git a/Xext/xf86bigfont.c b/Xext/xf86bigfont.c
index 95b5371..97596ea 100644
--- a/Xext/xf86bigfont.c
+++ b/Xext/xf86bigfont.c
@@ -96,8 +96,6 @@ static Bool badSysCall = FALSE;
 
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
 
-#include <sys/signal.h>
-
 static void
 SigSysHandler(int signo)
 {
@@ -111,7 +109,7 @@ CheckForShmSyscall(void)
     int shmid = -1;
 
     /* If no SHM support in the kernel, the bad syscall will generate SIGSYS */
-    oldHandler = signal(SIGSYS, SigSysHandler);
+    oldHandler = OsSignal(SIGSYS, SigSysHandler);
 
     badSysCall = FALSE;
     shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT);
@@ -123,7 +121,7 @@ CheckForShmSyscall(void)
         /* Allocation failed */
         badSysCall = TRUE;
     }
-    signal(SIGSYS, oldHandler);
+    OsSignal(SIGSYS, oldHandler);
     return !badSysCall;
 }
 
diff --git a/hw/dmx/input/lnx-keyboard.c b/hw/dmx/input/lnx-keyboard.c
index 0aa62f4..2a5ce79 100644
--- a/hw/dmx/input/lnx-keyboard.c
+++ b/hw/dmx/input/lnx-keyboard.c
@@ -158,7 +158,6 @@
 #include <X11/Xos.h>
 #include <sys/ioctl.h>
 #include <errno.h>
-#include <signal.h>
 #include <sys/vt.h>
 #include <sys/kd.h>
 #include <termios.h>
@@ -505,7 +504,7 @@ kbdLinuxVTSignalHandler(int sig)
 {
     myPrivate *priv = PRIV;
 
-    signal(sig, kbdLinuxVTSignalHandler);
+    OsSignal(sig, kbdLinuxVTSignalHandler);
     if (priv) {
         ioctl(priv->fd, VT_RELDISP, VT_ACKACQ);
         priv->switched = !priv->switched;
@@ -537,7 +536,7 @@ kbdLinuxActivate(int fd, int vtno, int setSig)
         VT.acqsig = SIGUSR1;
         if (ioctl(fd, VT_SETMODE, &VT))
             FATAL0("kbdLinuxActivate: VT_SETMODE VT_PROCESS failed\n");
-        signal(SIGUSR1, kbdLinuxVTSignalHandler);
+        OsSignal(SIGUSR1, kbdLinuxVTSignalHandler);
     }
     return Success;
 }
diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h
index f5015f6..7723bf1 100644
--- a/hw/kdrive/ephyr/ephyr.h
+++ b/hw/kdrive/ephyr/ephyr.h
@@ -27,7 +27,6 @@
 #define _EPHYR_H_
 #include <stdio.h>
 #include <unistd.h>
-#include <signal.h>
 #include <libgen.h>
 #include <xcb/xcb_image.h>
 
diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c
index a52bdef..76daaf2 100644
--- a/hw/kdrive/linux/linux.c
+++ b/hw/kdrive/linux/linux.c
@@ -25,7 +25,6 @@
 #endif
 #include "kdrive.h"
 #include <errno.h>
-#include <signal.h>
 #include <linux/vt.h>
 #include <linux/kd.h>
 #include <sys/stat.h>
diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 52bea5a..f02d826 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -43,8 +43,6 @@
 #include <execinfo.h>
 #endif
 
-#include <signal.h>
-
 #if defined(CONFIG_UDEV) || defined(CONFIG_HAL)
 #include <hotplug.h>
 #endif
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 4119b08..c2fc7bb 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -32,7 +32,6 @@
 #if HAVE_X11_XF86KEYSYM_H
 #include <X11/XF86keysym.h>
 #endif
-#include <signal.h>
 #include <stdio.h>
 #ifdef __sun
 #include <sys/file.h>           /* needed for FNONBLOCK & FASYNC */
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 323ac11..93c0d74 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -308,16 +308,16 @@ InstallSignalHandlers(void)
         OsRegisterSigWrapper(xf86SigWrapper);
     }
     else {
-        signal(SIGSEGV, SIG_DFL);
-        signal(SIGILL, SIG_DFL);
+        OsSignal(SIGSEGV, SIG_DFL);
+        OsSignal(SIGILL, SIG_DFL);
 #ifdef SIGEMT
-        signal(SIGEMT, SIG_DFL);
+        OsSignal(SIGEMT, SIG_DFL);
 #endif
-        signal(SIGFPE, SIG_DFL);
-        signal(SIGBUS, SIG_DFL);
-        signal(SIGSYS, SIG_DFL);
-        signal(SIGXCPU, SIG_DFL);
-        signal(SIGXFSZ, SIG_DFL);
+        OsSignal(SIGFPE, SIG_DFL);
+        OsSignal(SIGBUS, SIG_DFL);
+        OsSignal(SIGSYS, SIG_DFL);
+        OsSignal(SIGXCPU, SIG_DFL);
+        OsSignal(SIGXFSZ, SIG_DFL);
     }
 }
 
@@ -924,7 +924,7 @@ OsVendorInit(void)
 {
     static Bool beenHere = FALSE;
 
-    signal(SIGCHLD, SIG_DFL);   /* Need to wait for child processes */
+    OsSignal(SIGCHLD, SIG_DFL);   /* Need to wait for child processes */
 
     if (!beenHere) {
         umask(022);
diff --git a/hw/xfree86/os-support/bsd/bsd_init.c b/hw/xfree86/os-support/bsd/bsd_init.c
index 38dfde1..0d5d3c8 100644
--- a/hw/xfree86/os-support/bsd/bsd_init.c
+++ b/hw/xfree86/os-support/bsd/bsd_init.c
@@ -269,7 +269,7 @@ xf86OpenConsole()
                             "xf86OpenConsole: VT_WAITACTIVE failed\n");
                 }
 
-                signal(SIGUSR1, xf86VTRequest);
+                OsSignal(SIGUSR1, xf86VTRequest);
 
                 vtmode.mode = VT_PROCESS;
                 vtmode.relsig = SIGUSR1;
diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
index 1ed213c..d3a53ea 100644
--- a/hw/xfree86/os-support/linux/lnx_init.c
+++ b/hw/xfree86/os-support/linux/lnx_init.c
@@ -247,7 +247,7 @@ xf86OpenConsole(void)
                 FatalError("xf86OpenConsole: VT_GETMODE failed %s\n",
                            strerror(errno));
 
-            signal(SIGUSR1, xf86VTRequest);
+            OsSignal(SIGUSR1, xf86VTRequest);
 
             VT.mode = VT_PROCESS;
             VT.relsig = SIGUSR1;
diff --git a/hw/xfree86/os-support/shared/VTsw_usl.c b/hw/xfree86/os-support/shared/VTsw_usl.c
index f20106c..6440261 100644
--- a/hw/xfree86/os-support/shared/VTsw_usl.c
+++ b/hw/xfree86/os-support/shared/VTsw_usl.c
@@ -43,7 +43,7 @@
 void
 xf86VTRequest(int sig)
 {
-    signal(sig, (void (*)(int)) xf86VTRequest);
+    OsSignal(sig, (void (*)(int)) xf86VTRequest);
     xf86Info.vtRequestsPending = TRUE;
     return;
 }
diff --git a/hw/xfree86/parser/write.c b/hw/xfree86/parser/write.c
index 9a24dd6..122e967 100644
--- a/hw/xfree86/parser/write.c
+++ b/hw/xfree86/parser/write.c
@@ -63,7 +63,6 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
-#include <signal.h>
 #include <errno.h>
 
 #if defined(HAVE_SETEUID) && defined(_POSIX_SAVED_IDS) && _POSIX_SAVED_IDS > 0
@@ -141,7 +140,7 @@ xf86writeConfigFile(const char *filename, XF86ConfigPtr cptr)
         void (*csig) (int);
 
         /* Need to fork to change ruid without loosing euid */
-        csig = signal(SIGCHLD, SIG_DFL);
+        csig = OsSignal(SIGCHLD, SIG_DFL);
         switch ((pid = fork())) {
         case -1:
             ErrorF("xf86writeConfigFile(): fork failed (%s)\n",
@@ -159,7 +158,7 @@ xf86writeConfigFile(const char *filename, XF86ConfigPtr cptr)
                 p = waitpid(pid, &status, 0);
             } while (p == -1 && errno == EINTR);
         }
-        signal(SIGCHLD, csig);
+        OsSignal(SIGCHLD, csig);
         if (p != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0)
             return 1;           /* success */
         else
diff --git a/include/globals.h b/include/globals.h
index 858c9a3..693bdf4 100644
--- a/include/globals.h
+++ b/include/globals.h
@@ -2,8 +2,6 @@
 #ifndef _XSERV_GLOBAL_H_
 #define _XSERV_GLOBAL_H_
 
-#include <signal.h>
-
 #include "window.h"             /* for WindowPtr */
 #include "extinit.h"
 
diff --git a/os/utils.c b/os/utils.c
index 086fe4f..5871ef8 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -1395,7 +1395,7 @@ System(const char *command)
     if (!command)
         return 1;
 
-    csig = signal(SIGCHLD, SIG_DFL);
+    csig = OsSignal(SIGCHLD, SIG_DFL);
     if (csig == SIG_ERR) {
         perror("signal");
         return -1;
@@ -1420,7 +1420,7 @@ System(const char *command)
 
     }
 
-    if (signal(SIGCHLD, csig) == SIG_ERR) {
+    if (OsSignal(SIGCHLD, csig) == SIG_ERR) {
         perror("signal");
         return -1;
     }


More information about the xorg-commit mailing list