1 // 2 // The LLVM Compiler Infrastructure 3 // 4 // This file is distributed under the University of Illinois Open Source 5 // License. See LICENSE.TXT for details. 6 7 #include <CoreFoundation/CoreFoundation.h> 8 9 #include <dispatch/dispatch.h> 10 #include <unistd.h> 11 //#import <Foundation/Foundation.h> 12 #include <Block.h> 13 14 // CONFIG rdar://problem/6371811 15 16 const char *whoami = "nobody"; 17 18 void EnqueueStuff(dispatch_queue_t q) 19 { 20 __block CFIndex counter; 21 22 // above call has a side effect: it works around: 23 // <rdar://problem/6225809> __block variables not implicitly imported into intermediate scopes 24 dispatch_async(q, ^{ 25 counter = 0; 26 }); 27 28 29 dispatch_async(q, ^{ 30 //printf("outer block.\n"); 31 counter++; 32 dispatch_async(q, ^{ 33 //printf("inner block.\n"); 34 counter--; 35 if(counter == 0) { 36 printf("%s: success\n", whoami); 37 exit(0); 38 } 39 }); 40 if(counter == 0) { 41 printf("already done? inconceivable!\n"); 42 exit(1); 43 } 44 }); 45 } 46 47 int main (int argc, const char * argv[]) { 48 dispatch_queue_t q = dispatch_queue_create("queue", NULL); 49 50 whoami = argv[0]; 51 52 EnqueueStuff(q); 53 54 dispatch_main(); 55 printf("shouldn't get here\n"); 56 return 1; 57 } 58