brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.1 KiB · 36ddfad Raw
48 lines · plain
1// RUN: %clang_tsan %s -o %t -framework Foundation2// RUN: %deflake %run %t 2>&1 | FileCheck %s3 4#import <Foundation/Foundation.h>5 6#import "../test.h"7 8pthread_mutex_t m1;9pthread_mutex_t m2;10 11int main(int argc, const char *argv[]) {12  barrier_init(&barrier, 2);13  fprintf(stderr, "Hello world.\n");14 15  pthread_mutex_init(&m1, NULL);16  pthread_mutex_init(&m2, NULL);17  18  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{19    pthread_mutex_lock(&m1);20    pthread_mutex_lock(&m2);21    pthread_mutex_unlock(&m2);22    pthread_mutex_unlock(&m1);23 24    barrier_wait(&barrier);25  });26  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{27    barrier_wait(&barrier);28 29    pthread_mutex_lock(&m2);30    pthread_mutex_lock(&m1);31    pthread_mutex_unlock(&m1);32    pthread_mutex_unlock(&m2);33 34    dispatch_sync(dispatch_get_main_queue(), ^{35      CFRunLoopStop(CFRunLoopGetCurrent());36    });37  });38 39  CFRunLoopRun();40  41  fprintf(stderr, "Done.\n");42  return 0;43}44 45// CHECK: Hello world.46// CHECK: WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock)47// CHECK: Done.48