xref: /llvm-project/compiler-rt/test/tsan/on_exit.cpp (revision 6703fe25b7c26742cb511ba0e6050173188dd2f1)
13f87788dSDmitry Vyukov // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2*6703fe25SJulian Lettner 
3*6703fe25SJulian Lettner // on_exit() is not available on Darwin.
4*6703fe25SJulian Lettner // UNSUPPORTED: darwin
5*6703fe25SJulian Lettner 
63f87788dSDmitry Vyukov #include "test.h"
73f87788dSDmitry Vyukov 
83f87788dSDmitry Vyukov volatile long global;
93f87788dSDmitry Vyukov 
thread(void * x)103f87788dSDmitry Vyukov void *thread(void *x) {
113f87788dSDmitry Vyukov   global++;
123f87788dSDmitry Vyukov   barrier_wait(&barrier);
133f87788dSDmitry Vyukov   return nullptr;
143f87788dSDmitry Vyukov }
153f87788dSDmitry Vyukov 
on_exit_callback(int status,void * arg)163f87788dSDmitry Vyukov void on_exit_callback(int status, void *arg) {
173f87788dSDmitry Vyukov   fprintf(stderr, "on_exit_callback(%d, %lu)\n", status, (long)arg);
183f87788dSDmitry Vyukov   global++;
193f87788dSDmitry Vyukov }
203f87788dSDmitry Vyukov 
main()213f87788dSDmitry Vyukov int main() {
223f87788dSDmitry Vyukov   on_exit(on_exit_callback, (void *)42l);
233f87788dSDmitry Vyukov   barrier_init(&barrier, 2);
243f87788dSDmitry Vyukov   pthread_t th;
253f87788dSDmitry Vyukov   pthread_create(&th, nullptr, thread, nullptr);
263f87788dSDmitry Vyukov   pthread_detach(th);
273f87788dSDmitry Vyukov   barrier_wait(&barrier);
283f87788dSDmitry Vyukov   return 2;
293f87788dSDmitry Vyukov }
303f87788dSDmitry Vyukov 
313f87788dSDmitry Vyukov // CHECK: on_exit_callback(2, 42)
323f87788dSDmitry Vyukov // CHECK: WARNING: ThreadSanitizer: data race
333f87788dSDmitry Vyukov // CHECK:   Write of size 8
343f87788dSDmitry Vyukov // CHECK:     #0 on_exit_callback
35a1dc97e4SDmitry Vyukov // CHECK:     #1 on_exit_callback_installed_at
36a1dc97e4SDmitry Vyukov // CHECK:     #2 main
37