tsan: fix atexit handling after fork

fixes issue http://code.google.com/p/thread-sanitizer/issues/detail?id=57

llvm-svn: 206980
This commit is contained in:
Dmitry Vyukov 2014-04-23 13:42:16 +00:00
parent 6a00cc8306
commit ac81ee5533
2 changed files with 40 additions and 1 deletions

View File

@ -333,7 +333,9 @@ static AtExitContext *atexit_ctx;
TSAN_INTERCEPTOR(int, atexit, void (*f)()) {
if (cur_thread()->in_symbolizer)
return 0;
SCOPED_TSAN_INTERCEPTOR(atexit, f);
// We want to setup the atexit callback even if we are in ignored lib
// or after fork.
SCOPED_INTERCEPTOR_RAW(atexit, f);
return atexit_ctx->atexit(thr, pc, false, (void(*)())f, 0);
}

View File

@ -0,0 +1,37 @@
// RUN: %clangxx_tsan -O1 %s -o %t && TSAN_OPTIONS="atexit_sleep_ms=50" %t 2>&1 | FileCheck %s
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void foo() {
printf("CHILD ATEXIT\n");
}
void *worker(void *unused) {
return 0;
}
int main() {
pthread_t t;
pthread_create(&t, NULL, worker, NULL);
int pid = fork();
if (pid == 0) {
// child
atexit(foo);
fprintf(stderr, "CHILD DONE\n");
} else {
pthread_join(t, 0);
if (waitpid(pid, 0, 0) == -1) {
perror("waitpid");
exit(1);
}
fprintf(stderr, "PARENT DONE\n");
}
}
// CHECK: CHILD DONE
// CHECK: CHILD ATEXIT
// CHECK: PARENT DONE