From 139c72f38a07c545f5a9ab5fa3750779987b9275 Mon Sep 17 00:00:00 2001 From: Tvrtko Ursulin Date: Tue, 3 Dec 2013 16:44:55 +0000 Subject: drmtest: Avoid wrong PID/TID after clone races Various C library implementations have various races with regards to caching getpid() or TID inside pthread_kill() implementations. For example see clone(2) glibc man page and pthread_kill Bionic C library source. Work around that by making sure correct PID/TGID and TID values are retrieved from the kernel when re-raising the signal. It can be delivered immediately after the clone system call while C library cached copies have not yet been updated. Signed-off-by: Tvrtko Ursulin Signed-off-by: Daniel Vetter --- lib/drmtest.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/drmtest.c b/lib/drmtest.c index eeab5e64..6f5b06c3 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include "drmtest.h" #include "i915_drm.h" @@ -1479,6 +1481,8 @@ static void igt_atexit_handler(void) static void fatal_sig_handler(int sig) { + pid_t pid, tid; + restore_all_sig_handler(); /* @@ -1487,7 +1491,11 @@ static void fatal_sig_handler(int sig) */ call_exit_handlers(sig); - raise(sig); + /* Workaround cached PID and TID races on glibc and Bionic libc. */ + pid = syscall(SYS_getpid); + tid = syscall(SYS_gettid); + + syscall(SYS_tgkill, pid, tid, sig); } /* -- cgit v1.2.3