1c77bf89dSJulian Lettner // RUN: %clang_tsan %s -o %t 2*a59dad92SJulian Lettner // RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer' 3c77bf89dSJulian Lettner 4c77bf89dSJulian Lettner #include "dispatch/dispatch.h" 5c77bf89dSJulian Lettner 6c77bf89dSJulian Lettner #include <stdio.h> 7c77bf89dSJulian Lettner 8c77bf89dSJulian Lettner long global; 9c77bf89dSJulian Lettner main()10c77bf89dSJulian Lettnerint main() { 11c77bf89dSJulian Lettner fprintf(stderr, "Hello world.\n"); 12c77bf89dSJulian Lettner dispatch_semaphore_t done = dispatch_semaphore_create(0); 13c77bf89dSJulian Lettner 14c77bf89dSJulian Lettner dispatch_queue_t q1 = dispatch_queue_create("my.queue1", DISPATCH_QUEUE_CONCURRENT); 15c77bf89dSJulian Lettner dispatch_queue_t q2 = dispatch_queue_create("my.queue2", DISPATCH_QUEUE_SERIAL); 16c77bf89dSJulian Lettner 17c77bf89dSJulian Lettner global = 42; 18c77bf89dSJulian Lettner for (int i = 0; i < 10; i++) { 19c77bf89dSJulian Lettner dispatch_async(q1, ^{ 20c77bf89dSJulian Lettner for (int i = 0; i < 100; i++) { 21c77bf89dSJulian Lettner dispatch_sync(q2, ^{ 22c77bf89dSJulian Lettner global++; 23c77bf89dSJulian Lettner }); 24c77bf89dSJulian Lettner } 25c77bf89dSJulian Lettner }); 26c77bf89dSJulian Lettner } 27c77bf89dSJulian Lettner 28c77bf89dSJulian Lettner dispatch_barrier_async(q1, ^{ 29c77bf89dSJulian Lettner dispatch_semaphore_signal(done); 30c77bf89dSJulian Lettner }); 31c77bf89dSJulian Lettner 32c77bf89dSJulian Lettner dispatch_semaphore_wait(done, DISPATCH_TIME_FOREVER); 33c77bf89dSJulian Lettner fprintf(stderr, "Done.\n"); 34c77bf89dSJulian Lettner } 35c77bf89dSJulian Lettner 36c77bf89dSJulian Lettner // CHECK: Hello world. 37c77bf89dSJulian Lettner // CHECK: Done. 38