From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> 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 <tvrtko.ursulin@xxxxxxxxx> --- lib/drmtest.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/drmtest.c b/lib/drmtest.c index dcacd3b..139eb82 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -43,6 +43,8 @@ #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> +#include <sys/types.h> +#include <sys/syscall.h> #include "drmtest.h" #include "i915_drm.h" @@ -1473,6 +1475,8 @@ static void igt_atexit_handler(void) static void fatal_sig_handler(int sig) { + pid_t pid, tid; + restore_all_sig_handler(); /* @@ -1481,7 +1485,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); } /* -- 1.8.4.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx