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:
parent
6a00cc8306
commit
ac81ee5533
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue