[PATCH xserver 09/20] hw/kdrive: Use NotifyFd for kdrive input devices

Keith Packard keithp at keithp.com
Wed Nov 11 22:02:09 PST 2015


This switches the kdrive code to use FD notification for input
devices, rather than the block and wakeup handlers.

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 hw/kdrive/src/kinput.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 4bb9315..da4f84a 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -153,7 +153,16 @@ KdNonBlockFd(int fd)
 }
 
 static void
-KdAddFd(int fd)
+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;
@@ -162,6 +171,7 @@ KdAddFd(int fd)
     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);
@@ -181,6 +191,7 @@ KdRemoveFd(int fd)
 
     kdnFds--;
     RemoveEnabledDevice(fd);
+    RemoveNotifyFd(fd);
     flags = fcntl(fd, F_GETFL);
     flags &= ~(FASYNC | NOBLOCK);
     fcntl(fd, F_SETFL, flags);
@@ -202,9 +213,9 @@ KdRegisterFd(int fd, void (*read) (int fd, void *closure), void *closure)
     kdInputFds[kdNumInputFds].enable = 0;
     kdInputFds[kdNumInputFds].disable = 0;
     kdInputFds[kdNumInputFds].closure = closure;
-    kdNumInputFds++;
     if (kdInputEnabled)
-        KdAddFd(fd);
+        KdAddFd(fd, kdNumInputFds);
+    kdNumInputFds++;
     return TRUE;
 }
 
@@ -1933,19 +1944,8 @@ KdBlockHandler(ScreenPtr pScreen, void *timeo, void *readmask)
 void
 KdWakeupHandler(ScreenPtr pScreen, unsigned long lresult, void *readmask)
 {
-    int result = (int) lresult;
-    fd_set *pReadmask = (fd_set *) readmask;
-    int i;
     KdPointerInfo *pi;
 
-    if (kdInputEnabled && result > 0) {
-        for (i = 0; i < kdNumInputFds; i++)
-            if (FD_ISSET(kdInputFds[i].fd, pReadmask)) {
-                OsBlockSIGIO();
-                (*kdInputFds[i].read) (kdInputFds[i].fd, kdInputFds[i].closure);
-                OsReleaseSIGIO();
-            }
-    }
     for (pi = kdPointers; pi; pi = pi->next) {
         if (pi->timeoutPending) {
             if ((long) (GetTimeInMillis() - pi->emulationTimeout) >= 0) {
-- 
2.6.1



More information about the xorg-devel mailing list