1*673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -pthread -o %t && %run %t
2*673dc3d4SNico Weber // RUN: %clangxx_asan -O2 %s -pthread -o %t && %run %t
3*673dc3d4SNico Weber // REQUIRES: stable-runtime
4*673dc3d4SNico Weber 
5*673dc3d4SNico Weber #include <assert.h>
6*673dc3d4SNico Weber #include <pthread.h>
7*673dc3d4SNico Weber #include <sanitizer/allocator_interface.h>
8*673dc3d4SNico Weber #include <stdio.h>
9*673dc3d4SNico Weber #include <stdlib.h>
10*673dc3d4SNico Weber 
11*673dc3d4SNico Weber const size_t kLargeAlloc = 1UL << 20;
12*673dc3d4SNico Weber 
allocate(void * arg)13*673dc3d4SNico Weber void* allocate(void *arg) {
14*673dc3d4SNico Weber   volatile void *ptr = malloc(kLargeAlloc);
15*673dc3d4SNico Weber   free((void*)ptr);
16*673dc3d4SNico Weber   return 0;
17*673dc3d4SNico Weber }
18*673dc3d4SNico Weber 
check_stats(void * arg)19*673dc3d4SNico Weber void* check_stats(void *arg) {
20*673dc3d4SNico Weber   assert(__sanitizer_get_current_allocated_bytes() > 0);
21*673dc3d4SNico Weber   return 0;
22*673dc3d4SNico Weber }
23*673dc3d4SNico Weber 
main()24*673dc3d4SNico Weber int main() {
25*673dc3d4SNico Weber   size_t used_mem = __sanitizer_get_current_allocated_bytes();
26*673dc3d4SNico Weber   printf("Before: %zu\n", used_mem);
27*673dc3d4SNico Weber   const int kNumIterations = 1000;
28*673dc3d4SNico Weber   for (int iter = 0; iter < kNumIterations; iter++) {
29*673dc3d4SNico Weber     pthread_t thr[4];
30*673dc3d4SNico Weber     for (int j = 0; j < 4; j++) {
31*673dc3d4SNico Weber       assert(0 ==
32*673dc3d4SNico Weber              pthread_create(&thr[j], 0, (j < 2) ? allocate : check_stats, 0));
33*673dc3d4SNico Weber     }
34*673dc3d4SNico Weber     for (int j = 0; j < 4; j++)
35*673dc3d4SNico Weber       assert(0 == pthread_join(thr[j], 0));
36*673dc3d4SNico Weber     used_mem = __sanitizer_get_current_allocated_bytes();
37*673dc3d4SNico Weber     if (used_mem > kLargeAlloc) {
38*673dc3d4SNico Weber       printf("After iteration %d: %zu\n", iter, used_mem);
39*673dc3d4SNico Weber       return 1;
40*673dc3d4SNico Weber     }
41*673dc3d4SNico Weber   }
42*673dc3d4SNico Weber   printf("Success after %d iterations\n", kNumIterations);
43*673dc3d4SNico Weber   return 0;
44*673dc3d4SNico Weber }
45