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