xref: /llvm-project/compiler-rt/test/tsan/ignore_lib_lib.h (revision e6a6183e9b8ecf7dec8808fa87577d5b574ca22e)
1*e6a6183eSAlexey Samsonov #include <pthread.h>
2*e6a6183eSAlexey Samsonov #include <string.h>
3*e6a6183eSAlexey Samsonov #include <stdlib.h>
4*e6a6183eSAlexey Samsonov #include <stdio.h>
5*e6a6183eSAlexey Samsonov #include <unistd.h>
6*e6a6183eSAlexey Samsonov 
7*e6a6183eSAlexey Samsonov void *volatile mem;
8*e6a6183eSAlexey Samsonov volatile int len;
9*e6a6183eSAlexey Samsonov 
Thread(void * p)10*e6a6183eSAlexey Samsonov void *Thread(void *p) {
11*e6a6183eSAlexey Samsonov   while ((p = __atomic_load_n(&mem, __ATOMIC_ACQUIRE)) == 0)
12*e6a6183eSAlexey Samsonov     usleep(100);
13*e6a6183eSAlexey Samsonov   memset(p, 0, len);
14*e6a6183eSAlexey Samsonov   return 0;
15*e6a6183eSAlexey Samsonov }
16*e6a6183eSAlexey Samsonov 
libfunc()17*e6a6183eSAlexey Samsonov extern "C" void libfunc() {
18*e6a6183eSAlexey Samsonov   pthread_t t;
19*e6a6183eSAlexey Samsonov   pthread_create(&t, 0, Thread, 0);
20*e6a6183eSAlexey Samsonov   len = 10;
21*e6a6183eSAlexey Samsonov   __atomic_store_n(&mem, malloc(len), __ATOMIC_RELEASE);
22*e6a6183eSAlexey Samsonov   pthread_join(t, 0);
23*e6a6183eSAlexey Samsonov   free(mem);
24*e6a6183eSAlexey Samsonov   fprintf(stderr, "OK\n");
25*e6a6183eSAlexey Samsonov }
26