18c1441f8SAlexey Samsonov // 2*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 3*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 4*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 58c1441f8SAlexey Samsonov 68c1441f8SAlexey Samsonov #include <CoreFoundation/CoreFoundation.h> 78c1441f8SAlexey Samsonov 88c1441f8SAlexey Samsonov #include <dispatch/dispatch.h> 98c1441f8SAlexey Samsonov #include <unistd.h> 108c1441f8SAlexey Samsonov //#import <Foundation/Foundation.h> 118c1441f8SAlexey Samsonov #include <Block.h> 128c1441f8SAlexey Samsonov 138c1441f8SAlexey Samsonov // CONFIG rdar://problem/6371811 148c1441f8SAlexey Samsonov 158c1441f8SAlexey Samsonov const char *whoami = "nobody"; 168c1441f8SAlexey Samsonov EnqueueStuff(dispatch_queue_t q)178c1441f8SAlexey Samsonovvoid EnqueueStuff(dispatch_queue_t q) 188c1441f8SAlexey Samsonov { 198c1441f8SAlexey Samsonov __block CFIndex counter; 208c1441f8SAlexey Samsonov 218c1441f8SAlexey Samsonov // above call has a side effect: it works around: 228c1441f8SAlexey Samsonov // <rdar://problem/6225809> __block variables not implicitly imported into intermediate scopes 238c1441f8SAlexey Samsonov dispatch_async(q, ^{ 248c1441f8SAlexey Samsonov counter = 0; 258c1441f8SAlexey Samsonov }); 268c1441f8SAlexey Samsonov 278c1441f8SAlexey Samsonov 288c1441f8SAlexey Samsonov dispatch_async(q, ^{ 298c1441f8SAlexey Samsonov //printf("outer block.\n"); 308c1441f8SAlexey Samsonov counter++; 318c1441f8SAlexey Samsonov dispatch_async(q, ^{ 328c1441f8SAlexey Samsonov //printf("inner block.\n"); 338c1441f8SAlexey Samsonov counter--; 348c1441f8SAlexey Samsonov if(counter == 0) { 358c1441f8SAlexey Samsonov printf("%s: success\n", whoami); 368c1441f8SAlexey Samsonov exit(0); 378c1441f8SAlexey Samsonov } 388c1441f8SAlexey Samsonov }); 398c1441f8SAlexey Samsonov if(counter == 0) { 408c1441f8SAlexey Samsonov printf("already done? inconceivable!\n"); 418c1441f8SAlexey Samsonov exit(1); 428c1441f8SAlexey Samsonov } 438c1441f8SAlexey Samsonov }); 448c1441f8SAlexey Samsonov } 458c1441f8SAlexey Samsonov main(int argc,const char * argv[])468c1441f8SAlexey Samsonovint main (int argc, const char * argv[]) { 478c1441f8SAlexey Samsonov dispatch_queue_t q = dispatch_queue_create("queue", NULL); 488c1441f8SAlexey Samsonov 498c1441f8SAlexey Samsonov whoami = argv[0]; 508c1441f8SAlexey Samsonov 518c1441f8SAlexey Samsonov EnqueueStuff(q); 528c1441f8SAlexey Samsonov 538c1441f8SAlexey Samsonov dispatch_main(); 548c1441f8SAlexey Samsonov printf("shouldn't get here\n"); 558c1441f8SAlexey Samsonov return 1; 568c1441f8SAlexey Samsonov } 57