[libdispatch-dev] trivial linux patch + general questions

"C. Bergström" cbergstrom at pathscale.com
Fri Apr 22 05:46:04 PDT 2011


Joakim Johansson wrote:
> Any results/experience would be of interest, both good or bad!
>   

Here's the problem we're currently facing..

The following code and some details from another engineer:

    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    int iterations = n / m;
    struct args1 args[iterations];
    for (int i=0 ; i<iterations ; i+=m)
    {
        args[i].n = &n;
        args[i].v1 = &v1;
        args[i].v2 = &v2;
        args[i].v3 = &v3;
        args[i].start = i*m;
        args[i].start = args[i].start + m;
        dispatch_async_f(q, &args[i], codeletOk_codelet1);
    }
    struct args1 last = { &n, &v1, &v2, &v3, iterations*m, n%m };
    dispatch_sync_f(q, &last, codeletOk_codelet1);
#1 in this statement for (int i=0 ; i<iterations ; i+=m) . Should it be 
like for (int i=0 ; i<iterations * m ; i+=m) for an complete loop?
#2 args[i].start = i*m;
    args[i].start = args[i].start + m;
should it be like:
    args[i].start = i;
    args[i].start = args[i].start + m;
#3  struct args1 last = { &n, &v1, &v2, &v3, iterations*m, n%m }; Should 
it be like:
      struct args1 last = { &n, &v1, &v2, &v3, iterations*m, n%m + 
iterations*m} ?
#4 When I run the the code I found it wouldn't wait until 
dispatch_async_f(q, &args[i], codeletOk_codelet1) is over then the whole 
program was over.


It can run correctly if we replace dispatch_async_f(q, &args[i], 
codeletOk_codelet1); with codeletOk_codelet1(&args[i]) and 
dispatch_sync_f(q, &last, codeletOk_codelet1); with 
codeletOk_codelet1(&last).
------
Any tips on how to debug the difference between async and sync?

Thanks

./C



More information about the libdispatch-dev mailing list