// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. #include <CoreFoundation/CoreFoundation.h> #include <dispatch/dispatch.h> #include <unistd.h> //#import <Foundation/Foundation.h> #include <Block.h> // CONFIG rdar://problem/6371811 const char *whoami = "nobody"; void EnqueueStuff(dispatch_queue_t q) { __block CFIndex counter; // above call has a side effect: it works around: // <rdar://problem/6225809> __block variables not implicitly imported into intermediate scopes dispatch_async(q, ^{ counter = 0; }); dispatch_async(q, ^{ //printf("outer block.\n"); counter++; dispatch_async(q, ^{ //printf("inner block.\n"); counter--; if(counter == 0) { printf("%s: success\n", whoami); exit(0); } }); if(counter == 0) { printf("already done? inconceivable!\n"); exit(1); } }); } int main (int argc, const char * argv[]) { dispatch_queue_t q = dispatch_queue_create("queue", NULL); whoami = argv[0]; EnqueueStuff(q); dispatch_main(); printf("shouldn't get here\n"); return 1; }