Am 12.11.2015 um 07:02 schrieb Keith Packard: > Eliminates polling every 20ms for device input. > > v2: rename ephyrPoll to ephyrXcbNotify and fix the API so it can be > used directly for SetNotifyFd. Thanks to Daniel Martin > <consume.no...@gmail.com> > > Signed-off-by: Keith Packard <kei...@keithp.com> > Cc: Daniel Martin <consume.no...@gmail.com> > ---
Same comment as before: This can miss pending events. If "something" uses xcb (even just sending a request is enough, doesn't have to be waiting for a reply), xcb could read an event from its FD and append it to its internal queue. At this point there is a pending event in the queue, but the socket isn't marked readable. With this change, the event won't be removed from the queue. Cheers, Uli > hw/kdrive/ephyr/ephyr.c | 6 ++++-- > hw/kdrive/ephyr/ephyr.h | 3 --- > hw/kdrive/ephyr/hostx.c | 6 ++++++ > hw/kdrive/ephyr/hostx.h | 2 ++ > hw/kdrive/ephyr/os.c | 1 - > 5 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c > index cb1c16e..896bac5 100644 > --- a/hw/kdrive/ephyr/ephyr.c > +++ b/hw/kdrive/ephyr/ephyr.c > @@ -1182,8 +1182,8 @@ ephyrProcessConfigureNotify(xcb_generic_event_t *xev) > #endif /* RANDR */ > } > > -void > -ephyrPoll(void) > +static void > +ephyrXcbNotify(int fd, int ready, void *data) > { > xcb_connection_t *conn = hostx_get_xcbconn(); > > @@ -1334,6 +1334,7 @@ static Status > MouseEnable(KdPointerInfo * pi) > { > ((EphyrPointerPrivate *) pi->driverPrivate)->enabled = TRUE; > + SetNotifyFd(hostx_get_fd(), ephyrXcbNotify, X_NOTIFY_READ, NULL); > return Success; > } > > @@ -1341,6 +1342,7 @@ static void > MouseDisable(KdPointerInfo * pi) > { > ((EphyrPointerPrivate *) pi->driverPrivate)->enabled = FALSE; > + RemoveNotifyFd(hostx_get_fd()); > return; > } > > diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h > index 18bfe11..f5015f6 100644 > --- a/hw/kdrive/ephyr/ephyr.h > +++ b/hw/kdrive/ephyr/ephyr.h > @@ -168,9 +168,6 @@ Bool > Bool > ephyrCreateColormap(ColormapPtr pmap); > > -void > - ephyrPoll(void); > - > #ifdef RANDR > Bool > ephyrRandRGetInfo(ScreenPtr pScreen, Rotation * rotations); > diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c > index 3991c51..49516bb 100644 > --- a/hw/kdrive/ephyr/hostx.c > +++ b/hw/kdrive/ephyr/hostx.c > @@ -1113,6 +1113,12 @@ hostx_get_screen(void) > } > > int > +hostx_get_fd(void) > +{ > + return xcb_get_file_descriptor(HostX.conn); > +} > + > +int > hostx_get_window(int a_screen_number) > { > EphyrScrPriv *scrpriv; > diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h > index 9299e8d..d416dae 100644 > --- a/hw/kdrive/ephyr/hostx.h > +++ b/hw/kdrive/ephyr/hostx.h > @@ -198,4 +198,6 @@ int hostx_has_dri(void); > int hostx_has_glx(void); > #endif /* XF86DRI */ > > +int hostx_get_fd(void); > + > #endif /*_XLIBS_STUFF_H_*/ > diff --git a/hw/kdrive/ephyr/os.c b/hw/kdrive/ephyr/os.c > index 0dbcbb8..b481d0a 100644 > --- a/hw/kdrive/ephyr/os.c > +++ b/hw/kdrive/ephyr/os.c > @@ -45,5 +45,4 @@ EphyrInit(void) > > KdOsFuncs EphyrOsFuncs = { > .Init = EphyrInit, > - .pollEvents = ephyrPoll, > }; > -- - Buck, when, exactly, did you lose your mind? - Three months ago. I woke up one morning married to a pineapple. An ugly pineapple... But I loved her. _______________________________________________ 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