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

Peter Hutterer peter.hutterer at who-t.net
Thu Feb 23 22:24:24 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>
Tested-by: Olivier Fourdan <ofourdan at redhat.com>
---
Changes to v1:
- add check for InputThreadInfo to avoid null-pointer dereference
- remove leftover declaration for in_input_thread

 include/input.h  | 1 +
 os/inputthread.c | 8 ++++++++
 os/io.c          | 3 +++
 3 files changed, 12 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..e7159c7 100644
--- a/os/inputthread.c
+++ b/os/inputthread.c
@@ -90,6 +90,13 @@ static pthread_mutex_t input_mutex;
 static Bool input_mutex_initialized;
 #endif
 
+int
+in_input_thread(void)
+{
+    return inputThreadInfo &&
+           pthread_equal(pthread_self(), inputThreadInfo->thread);
+}
+
 void
 input_lock(void)
 {
@@ -531,6 +538,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..8aa51a1 100644
--- a/os/io.c
+++ b/os/io.c
@@ -651,6 +651,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



More information about the xorg-devel mailing list