forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
//
 | 
						|
//                     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;
 | 
						|
}
 |