1673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -pthread -o %t && %run %t 2673dc3d4SNico Weber // RUN: %clangxx_asan -O2 %s -pthread -o %t && %run %t 3673dc3d4SNico Weber // REQUIRES: stable-runtime 4673dc3d4SNico Weber 5673dc3d4SNico Weber #include <assert.h> 6673dc3d4SNico Weber #include <pthread.h> 7673dc3d4SNico Weber #include <sanitizer/allocator_interface.h> 8673dc3d4SNico Weber #include <stdio.h> 9673dc3d4SNico Weber #include <stdlib.h> 10673dc3d4SNico Weber 11673dc3d4SNico Weber const size_t kLargeAlloc = 1UL << 20; 12673dc3d4SNico Weber allocate(void * arg)13673dc3d4SNico Webervoid* allocate(void *arg) { 14673dc3d4SNico Weber volatile void *ptr = malloc(kLargeAlloc); 15673dc3d4SNico Weber free((void*)ptr); 16673dc3d4SNico Weber return 0; 17673dc3d4SNico Weber } 18673dc3d4SNico Weber check_stats(void * arg)19673dc3d4SNico Webervoid* check_stats(void *arg) { 20*4effda09SChen Zheng assert(__sanitizer_get_current_allocated_bytes() >= 0); 21673dc3d4SNico Weber return 0; 22673dc3d4SNico Weber } 23673dc3d4SNico Weber main()24673dc3d4SNico Weberint main() { 25673dc3d4SNico Weber size_t used_mem = __sanitizer_get_current_allocated_bytes(); 26673dc3d4SNico Weber printf("Before: %zu\n", used_mem); 27673dc3d4SNico Weber const int kNumIterations = 1000; 28673dc3d4SNico Weber for (int iter = 0; iter < kNumIterations; iter++) { 29673dc3d4SNico Weber pthread_t thr[4]; 30673dc3d4SNico Weber for (int j = 0; j < 4; j++) { 31673dc3d4SNico Weber assert(0 == 32673dc3d4SNico Weber pthread_create(&thr[j], 0, (j < 2) ? allocate : check_stats, 0)); 33673dc3d4SNico Weber } 34673dc3d4SNico Weber for (int j = 0; j < 4; j++) 35673dc3d4SNico Weber assert(0 == pthread_join(thr[j], 0)); 36673dc3d4SNico Weber used_mem = __sanitizer_get_current_allocated_bytes(); 37673dc3d4SNico Weber if (used_mem > kLargeAlloc) { 38673dc3d4SNico Weber printf("After iteration %d: %zu\n", iter, used_mem); 39673dc3d4SNico Weber return 1; 40673dc3d4SNico Weber } 41673dc3d4SNico Weber } 42673dc3d4SNico Weber printf("Success after %d iterations\n", kNumIterations); 43673dc3d4SNico Weber return 0; 44673dc3d4SNico Weber } 45