// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s // REQUIRES: glibc-2.30 #include #include pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; struct timespec ts = {0}; void *tfunc(void *p) { if (!pthread_mutex_trylock(&m)) { puts("Second thread could not lock mutex"); pthread_mutex_unlock(&m); } return p; } int main() { if (!pthread_mutex_clocklock(&m, CLOCK_REALTIME, &ts)) { pthread_t thr; pthread_create(&thr, 0, tfunc, 0); pthread_join(thr, 0); pthread_mutex_unlock(&m); } else puts("Failed to lock mutex"); fprintf(stderr, "PASS\n"); } // CHECK-NOT: WARNING: ThreadSanitizer: unlock of an unlocked mutex // CHECK: PASS