diff options
author | Tvrtko Ursulin <tvrtko.ursulin@intel.com> | 2013-12-03 16:44:55 +0000 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-03 17:55:56 +0100 |
commit | 139c72f38a07c545f5a9ab5fa3750779987b9275 (patch) | |
tree | 7ed7e70ee725b7408e6b433c9fdeeb3ab6166008 | |
parent | 4f990f3ad21eb375918dde7ad7c55ee3a75158c4 (diff) |
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 <tvrtko.ursulin@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | lib/drmtest.c | 10 |
1 files changed, 9 insertions, 1 deletions
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 <stdlib.h> #include <unistd.h> #include <sys/wait.h> +#include <sys/types.h> +#include <sys/syscall.h> #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); } /* |