1*97ccf6b8SFangrui Song // Regression test for http://llvm.org/bugs/show_bug.cgi?id=21621 2*97ccf6b8SFangrui Song // This test relies on timing between threads, so any failures will be flaky. 3*97ccf6b8SFangrui Song // RUN: %clangxx_lsan %s -o %t 4*97ccf6b8SFangrui Song // RUN: %env_lsan_opts="log_pointers=1:log_threads=1" %run %t 5*97ccf6b8SFangrui Song #include <assert.h> 6*97ccf6b8SFangrui Song #include <pthread.h> 7*97ccf6b8SFangrui Song #include <stdio.h> 8*97ccf6b8SFangrui Song #include <stdlib.h> 9*97ccf6b8SFangrui Song 10*97ccf6b8SFangrui Song pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 11*97ccf6b8SFangrui Song pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 12*97ccf6b8SFangrui Song bool flag = false; 13*97ccf6b8SFangrui Song func(void * arg)14*97ccf6b8SFangrui Songvoid *func(void *arg) { 15*97ccf6b8SFangrui Song // This mutex will never be grabbed. 16*97ccf6b8SFangrui Song fprintf(stderr, "entered func()\n"); 17*97ccf6b8SFangrui Song pthread_mutex_lock(&mutex); 18*97ccf6b8SFangrui Song free(arg); 19*97ccf6b8SFangrui Song pthread_mutex_unlock(&mutex); 20*97ccf6b8SFangrui Song return 0; 21*97ccf6b8SFangrui Song } 22*97ccf6b8SFangrui Song create_detached_thread()23*97ccf6b8SFangrui Songvoid create_detached_thread() { 24*97ccf6b8SFangrui Song pthread_t thread_id; 25*97ccf6b8SFangrui Song pthread_attr_t attr; 26*97ccf6b8SFangrui Song 27*97ccf6b8SFangrui Song pthread_attr_init(&attr); 28*97ccf6b8SFangrui Song pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 29*97ccf6b8SFangrui Song 30*97ccf6b8SFangrui Song void *arg = malloc(1337); 31*97ccf6b8SFangrui Song assert(arg); 32*97ccf6b8SFangrui Song // This mutex is never unlocked by the main thread. 33*97ccf6b8SFangrui Song pthread_mutex_lock(&mutex); 34*97ccf6b8SFangrui Song int res = pthread_create(&thread_id, &attr, func, arg); 35*97ccf6b8SFangrui Song assert(res == 0); 36*97ccf6b8SFangrui Song } 37*97ccf6b8SFangrui Song main()38*97ccf6b8SFangrui Songint main() { 39*97ccf6b8SFangrui Song create_detached_thread(); 40*97ccf6b8SFangrui Song } 41