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 llvm-svn: 353385
This commit is contained in:
parent
66b18e5755
commit
17132b62e0
|
@ -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);
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue