#include <dispatch/dispatch.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <libkern/OSAtomic.h>
#include "dispatch_test.h"
#ifndef NSEC_PER_SEC
#define NSEC_PER_SEC 1000000000
#endif
dispatch_group_t
create_group(size_t count, int delay)
{
size_t i;
dispatch_group_t group = dispatch_group_create();
for (i = 0; i < count; ++i) {
dispatch_queue_t queue = dispatch_queue_create(NULL, NULL);
assert(queue);
dispatch_group_async(group, queue, ^{
if (delay) {
fprintf(stderr, "sleeping...\n");
sleep(delay);
fprintf(stderr, "done.\n");
}
});
dispatch_release(queue);
}
return group;
}
int
main(void)
{
long res;
test_start("Dispatch Group");
dispatch_group_t group;
group = create_group(100, 0);
test_ptr_notnull("dispatch_group_async", group);
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_async(group, dispatch_get_concurrent_queue(0), ^{});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);
group = NULL;
group = create_group(3, 7);
test_ptr_notnull("dispatch_group_async", group);
res = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC));
test_long("dispatch_group_wait", !res, 0);
res = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC));
test_long("dispatch_group_wait", res, 0);
dispatch_release(group);
group = NULL;
group = create_group(100, 0);
test_ptr_notnull("dispatch_group_async", group);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
dispatch_queue_t m = dispatch_get_main_queue();
dispatch_queue_t c = dispatch_get_current_queue();
test_ptr("Notification Received", m, c);
test_stop();
});
dispatch_release(group);
group = NULL;
dispatch_main();
return 0;
}