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 Webervoid* 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 Webervoid* 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 Weberint 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