[RFC xserver] os: log a bug whenever WriteToClient is called from the input thread
Olivier Fourdan
ofourdan at redhat.com
Thu Feb 23 16:04:43 UTC 2017
Hi,
> > 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>
^^^^^^^^^^^
Err, nope! I take that back, sorry, looks like it's causing trouble to Xwayland... it crashes.
> +int
> +in_input_thread(void)
> +{
> + return pthread_equal(pthread_self(), inputThreadInfo->thread);
> +}
If this gets called *before* the InputThread is even created, inputThreadInfo is NULL.
I would add a
if (!inputThreadInfo)
return 0;
Otherwise Xwayland crashes at startup. With something like that added, it works :)
Cheers,
Olivier
More information about the xorg-devel
mailing list