[PATCH xserver 10/20] kdrive/ephyr: Use NotifyFd for XCB connection input [v2]

Uli Schlachter psychon at znc.in
Fri Nov 13 05:04:06 PST 2015


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.noise at gmail.com>
> 
> Signed-off-by: Keith Packard <keithp at keithp.com>
> Cc: Daniel Martin <consume.noise at 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.


More information about the xorg-devel mailing list