186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// The LLVM Compiler Infrastructure 386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source 586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details. 686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <CoreFoundation/CoreFoundation.h> 886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <dispatch/dispatch.h> 1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <unistd.h> 1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//#import <Foundation/Foundation.h> 1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block.h> 1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG rdar://problem/6371811 1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstconst char *whoami = "nobody"; 1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid EnqueueStuff(dispatch_queue_t q) 1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst __block CFIndex counter; 2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst // above call has a side effect: it works around: 2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst // <rdar://problem/6225809> __block variables not implicitly imported into intermediate scopes 2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst dispatch_async(q, ^{ 2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst counter = 0; 2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst }); 2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst dispatch_async(q, ^{ 3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("outer block.\n"); 3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst counter++; 3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst dispatch_async(q, ^{ 3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("inner block.\n"); 3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst counter--; 3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if(counter == 0) { 3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: success\n", whoami); 3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst exit(0); 3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst }); 4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if(counter == 0) { 4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("already done? inconceivable!\n"); 4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst exit(1); 4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst }); 4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main (int argc, const char * argv[]) { 4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst dispatch_queue_t q = dispatch_queue_create("queue", NULL); 4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst whoami = argv[0]; 5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst EnqueueStuff(q); 5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst dispatch_main(); 5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("shouldn't get here\n"); 5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 1; 5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 58