diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2019-02-07 10:46:02 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2019-02-07 10:46:02 +0000 |
commit | 549d05671936adecd5f3f9acc547b60739129797 (patch) | |
tree | 3d75bf00db54186d435b171668cf1f3147b395d0 | |
parent | 9a7649b5770dd3f75e89e029a98048e1ea3b1aca (diff) | |
download | compiler-rt-549d05671936adecd5f3f9acc547b60739129797.tar.gz |
tsan: Implement pthread_exit() interceptor for Thread sanitizer
This change is preparation for fiber support.
Author: yuri (Yuri Per)
Reviewed in: https://reviews.llvm.org/D57876
Context: https://reviews.llvm.org/D54889
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@353385 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/tsan/rtl/tsan_interceptors.cc | 6 | ||||
-rw-r--r-- | test/tsan/thread_exit.c | 25 |
2 files changed, 31 insertions, 0 deletions
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index 540d9c106..6070b5975 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -1050,6 +1050,11 @@ TSAN_INTERCEPTOR(int, pthread_detach, void *th) { return res; } +TSAN_INTERCEPTOR(void, pthread_exit, void *retval) { + SCOPED_TSAN_INTERCEPTOR(pthread_exit, retval); + REAL(pthread_exit)(retval); +} + #if SANITIZER_LINUX TSAN_INTERCEPTOR(int, pthread_tryjoin_np, void *th, void **ret) { SCOPED_TSAN_INTERCEPTOR(pthread_tryjoin_np, th, ret); @@ -2664,6 +2669,7 @@ void InitializeInterceptors() { TSAN_INTERCEPT(pthread_create); TSAN_INTERCEPT(pthread_join); TSAN_INTERCEPT(pthread_detach); + TSAN_INTERCEPT(pthread_exit); #if SANITIZER_LINUX TSAN_INTERCEPT(pthread_tryjoin_np); TSAN_INTERCEPT(pthread_timedjoin_np); diff --git a/test/tsan/thread_exit.c b/test/tsan/thread_exit.c new file mode 100644 index 000000000..214b022b6 --- /dev/null +++ b/test/tsan/thread_exit.c @@ -0,0 +1,25 @@ +// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s +#include "test.h" + +int var; + +void *Thread(void *x) { + pthread_exit(&var); + return 0; +} + +int main() { + pthread_t t; + pthread_create(&t, 0, Thread, 0); + void *retval = 0; + pthread_join(t, &retval); + if (retval != &var) { + fprintf(stderr, "Unexpected return value\n"); + exit(1); + } + fprintf(stderr, "PASS\n"); + return 0; +} + +// CHECK-NOT: WARNING: ThreadSanitizer: +// CHECK: PASS |