| #include <stdio.h> |
| #include <limits.h> |
| #include <dispatch/dispatch.h> |
| #include <pthread.h> |
| |
| int |
| main () |
| { |
| __block int hicount = 1; |
| dispatch_queue_t queue1, queue2, queue3; |
| dispatch_group_t group = dispatch_group_create (); |
| queue1 = dispatch_queue_create ("com.apple.gdb.queue1", NULL); |
| queue2 = dispatch_queue_create ("com.apple.gdb.queue2", NULL); |
| queue3 = dispatch_queue_create ("com.apple.gdb.queue3", NULL); |
| |
| pthread_setname_np ("main execution thread"); |
| |
| dispatch_group_async (group, queue1, ^{sleep (20); puts("queue1 sleep done");}); |
| dispatch_group_async (group, queue1, ^{sleep (20); puts("queue1 sleep done");}); |
| dispatch_group_async (group, queue2, ^{sleep (20); puts("queue2 sleep done");}); |
| dispatch_group_async (group, queue2, ^{sleep (20); puts("queue2 sleep done");}); |
| |
| #if 0 |
| /* This is pretty cool but the extra output makes writing a testsuite |
| case more difficult so I'm commenting it out. */ |
| dispatch_source_timer_create (DISPATCH_TIMER_INTERVAL, 1 * NSEC_PER_SEC, 0, |
| NULL, queue3, |
| ^(dispatch_event_t event) { |
| printf (" hello %d\n", hicount++); |
| if (hicount == 34) |
| { |
| dispatch_release (dispatch_event_get_source (event)); |
| puts ("done saying hello"); |
| } |
| }); |
| #endif |
| |
| sleep (1); |
| puts ("waiting for work group's queues to complete."); // breakpoint here |
| dispatch_group_wait (group, UINT64_MAX); |
| |
| puts ("all queues completed"); |
| |
| dispatch_release (queue1); |
| dispatch_release (queue2); |
| dispatch_release (queue3); |
| dispatch_release (group); |
| return (0); |
| } |