// RUN: %clangxx_asan -O0 %s -pthread -o %t && %run %t // RUN: %clangxx_asan -O2 %s -pthread -o %t && %run %t // REQUIRES: stable-runtime #include <assert.h> #include <pthread.h> #include <sanitizer/allocator_interface.h> #include <stdio.h> #include <stdlib.h> const size_t kLargeAlloc = 1UL << 20; void* allocate(void *arg) { volatile void *ptr = malloc(kLargeAlloc); free((void*)ptr); return 0; } void* check_stats(void *arg) { assert(__sanitizer_get_current_allocated_bytes() > 0); return 0; } int main() { size_t used_mem = __sanitizer_get_current_allocated_bytes(); printf("Before: %zu\n", used_mem); const int kNumIterations = 1000; for (int iter = 0; iter < kNumIterations; iter++) { pthread_t thr[4]; for (int j = 0; j < 4; j++) { assert(0 == pthread_create(&thr[j], 0, (j < 2) ? allocate : check_stats, 0)); } for (int j = 0; j < 4; j++) assert(0 == pthread_join(thr[j], 0)); used_mem = __sanitizer_get_current_allocated_bytes(); if (used_mem > kLargeAlloc) { printf("After iteration %d: %zu\n", iter, used_mem); return 1; } } printf("Success after %d iterations\n", kNumIterations); return 0; }