[RFC xserver] os: log a bug whenever WriteToClient is called from the input thread

Olivier Fourdan ofourdan at redhat.com
Thu Feb 23 08:06:27 UTC 2017


> The input thread should generate events, not send them. Make it easier to
> find the instances where it's doing so.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  include/input.h  | 1 +
>  os/inputthread.c | 7 +++++++
>  os/io.c          | 6 ++++++
>  3 files changed, 14 insertions(+)
> 
> diff --git a/include/input.h b/include/input.h
> index bb58b22..6c9e45d 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -722,6 +722,7 @@ extern _X_HIDDEN void input_constrain_cursor(DeviceIntPtr
> pDev, ScreenPtr screen
>  extern _X_EXPORT void input_lock(void);
>  extern _X_EXPORT void input_unlock(void);
>  extern _X_EXPORT void input_force_unlock(void);
> +extern _X_EXPORT int in_input_thread(void);
>  
>  extern void InputThreadPreInit(void);
>  extern void InputThreadInit(void);
> diff --git a/os/inputthread.c b/os/inputthread.c
> index 4400fba..933bc1c 100644
> --- a/os/inputthread.c
> +++ b/os/inputthread.c
> @@ -90,6 +90,12 @@ static pthread_mutex_t input_mutex;
>  static Bool input_mutex_initialized;
>  #endif
>  
> +int
> +in_input_thread(void)
> +{
> +    return pthread_equal(pthread_self(), inputThreadInfo->thread);
> +}
> +
>  void
>  input_lock(void)
>  {
> @@ -531,6 +537,7 @@ void input_force_unlock(void) {}
>  void InputThreadPreInit(void) {}
>  void InputThreadInit(void) {}
>  void InputThreadFini(void) {}
> +int in_input_thread(void) { return 0; }
>  
>  int InputThreadRegisterDev(int fd,
>                             NotifyFdProcPtr readInputProc,
> diff --git a/os/io.c b/os/io.c
> index be85226..5494b30 100644
> --- a/os/io.c
> +++ b/os/io.c
> @@ -643,6 +643,9 @@ SetCriticalOutputPending(void)
>   *    this routine as int.
>   *****************/
>  
> +extern inline int
> +in_input_thread(void);
> +
>  int
>  WriteToClient(ClientPtr who, int count, const void *__buf)
>  {
> @@ -651,6 +654,9 @@ WriteToClient(ClientPtr who, int count, const void
> *__buf)
>      int padBytes;
>      const char *buf = __buf;
>  
> +    BUG_RETURN_VAL_MSG(in_input_thread(), 0,
> +                       "******** %s called from input thread *********\n",
> __func__);
> +
>  #ifdef DEBUG_COMMUNICATION
>      Bool multicount = FALSE;
>  #endif
> --
> 2.9.3

It works a treat, brilliant - Within not even a second approaching the stylus to the tablet, Xorg was logging messages about calling WriteToClient() from the input thread, it's just awesome!

Tested-by: Olivier Fourdan <ofourdan at redhat.com>

And if I'd dare, fwiw, it looks good to me.

Reviewed-by: Olivier Fourdan <ofourdan at redhat.com>

Cheers,
Olivier


More information about the xorg-devel mailing list