xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Wed Dec 2 07:43:27 PST 2015


 hw/xfree86/common/xf86Events.c |   67 +++++++++++++++++++++++++----------------
 1 file changed, 41 insertions(+), 26 deletions(-)

New commits:
commit 2e3d9623ae3f562f81e513cb183ca1b1b68f279c
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Dec 2 10:42:36 2015 -0500

    Revert "hw/xfree86: Use NotifyFd for device and other input fd wakeups"
    
    Reported to break libinput:
    
    http://lists.freedesktop.org/archives/xorg-devel/2015-December/048091.html
    
    This reverts commit 1df07dc36ca145c59f51176d9ab2651112506d75.

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 2db6e5b..709afd6 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -101,6 +101,8 @@ Bool VTSwitchEnabled = TRUE;    /* Allows run-time disabling for
                                  switches when using the DRI
                                  automatic full screen mode.*/
 
+extern fd_set EnabledDevices;
+
 #ifdef XF86PM
 extern void (*xf86OSPMClose) (void);
 #endif
@@ -245,6 +247,45 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
 void
 xf86Wakeup(void *blockData, int err, void *pReadmask)
 {
+    fd_set *LastSelectMask = (fd_set *) pReadmask;
+    fd_set devicesWithInput;
+    InputInfoPtr pInfo;
+
+    if (err >= 0) {
+
+        XFD_ANDSET(&devicesWithInput, LastSelectMask, &EnabledDevices);
+        if (XFD_ANYSET(&devicesWithInput)) {
+            pInfo = xf86InputDevs;
+            while (pInfo) {
+                if (pInfo->read_input && pInfo->fd >= 0 &&
+                    (FD_ISSET(pInfo->fd, &devicesWithInput) != 0)) {
+                    OsBlockSIGIO();
+
+                    /*
+                     * Remove the descriptior from the set because more than one
+                     * device may share the same file descriptor.
+                     */
+                    FD_CLR(pInfo->fd, &devicesWithInput);
+
+                    pInfo->read_input(pInfo);
+                    OsReleaseSIGIO();
+                }
+                pInfo = pInfo->next;
+            }
+        }
+    }
+
+    if (err >= 0) {             /* we don't want the handlers called if select() */
+        IHPtr ih, ih_tmp;       /* returned with an error condition, do we?      */
+
+        nt_list_for_each_entry_safe(ih, ih_tmp, InputHandlers, next) {
+            if (ih->enabled && ih->fd >= 0 && ih->ihproc &&
+                (FD_ISSET(ih->fd, ((fd_set *) pReadmask)) != 0)) {
+                ih->ihproc(ih->fd, ih->data);
+            }
+        }
+    }
+
     if (xf86VTSwitchPending())
         xf86VTSwitch();
 }
@@ -264,15 +305,6 @@ xf86SigioReadInput(int fd, void *closure)
     errno = errno_save;
 }
 
-static void
-xf86NotifyReadInput(int fd, int ready, void *closure)
-{
-    InputInfoPtr pInfo = closure;
-    OsBlockSIGIO();
-    pInfo->read_input(pInfo);
-    OsReleaseSIGIO();
-}
-
 /*
  * xf86AddEnabledDevice --
  *
@@ -282,7 +314,6 @@ xf86AddEnabledDevice(InputInfoPtr pInfo)
 {
     if (!xf86InstallSIGIOHandler(pInfo->fd, xf86SigioReadInput, pInfo)) {
         AddEnabledDevice(pInfo->fd);
-        SetNotifyFd(pInfo->fd, xf86NotifyReadInput, X_NOTIFY_READ, pInfo);
     }
 }
 
@@ -295,7 +326,6 @@ xf86RemoveEnabledDevice(InputInfoPtr pInfo)
 {
     if (!xf86RemoveSIGIOHandler(pInfo->fd)) {
         RemoveEnabledDevice(pInfo->fd);
-        RemoveNotifyFd(pInfo->fd);
     }
 }
 
@@ -606,16 +636,6 @@ xf86VTSwitch(void)
 
 /* Input handler registration */
 
-static void
-xf86InputHandlerNotify(int fd, int ready, void *data)
-{
-    IHPtr       ih = data;
-
-    if (ih->enabled && ih->fd >= 0 && ih->ihproc) {
-        ih->ihproc(ih->fd, ih->data);
-    }
-}
-
 static void *
 addInputHandler(int fd, InputHandlerProc proc, void *data)
 {
@@ -633,11 +653,6 @@ addInputHandler(int fd, InputHandlerProc proc, void *data)
     ih->data = data;
     ih->enabled = TRUE;
 
-    if (!SetNotifyFd(fd, xf86InputHandlerNotify, X_NOTIFY_READ, ih)) {
-        free(ih);
-        return NULL;
-    }
-
     ih->next = InputHandlers;
     InputHandlers = ih;
 


More information about the xorg-commit mailing list