#include #include #include #include #include "dispatch_test.h" int done = 0; #define QUEUES 80 dispatch_queue_t queues[QUEUES]; #define BLOCKS 10000 union { size_t index; char padding[64]; } indices[BLOCKS]; size_t iterations = QUEUES * BLOCKS * 0.25; void histogram(void) { size_t counts[QUEUES] = {}; size_t maxcount = 0; size_t q; for (q = 0; q < QUEUES; ++q) { size_t i; for (i = 0; i < BLOCKS; ++i) { if (indices[i].index == q) { ++counts[q]; } } } for (q = 0; q < QUEUES; ++q) { if (counts[q] > maxcount) { maxcount = counts[q]; } } printf("maxcount = %ld\n", maxcount); size_t x,y; for (y = 20; y > 0; --y) { for (x = 0; x < QUEUES; ++x) { double fraction = (double)counts[x] / (double)maxcount; double value = fraction * (double)20; printf("%s", (value > y) ? "*" : " "); } printf("\n"); } } void cascade(void* context) { size_t idx, *idxptr = context; if (done) return; idx = *idxptr + 1; if (idx < QUEUES) { *idxptr = idx; dispatch_async_f(queues[idx], context, cascade); } if (__sync_sub_and_fetch(&iterations, 1) == 0) { done = 1; histogram(); test_stop(); exit(0); } } int main(int argc __attribute__((unused)), char* argv[] __attribute__((unused))) { int i; test_start("Dispatch Cascade"); for (i = 0; i < QUEUES; ++i) { queues[i] = dispatch_queue_create(NULL, NULL); } for (i = 0; i < BLOCKS; ++i) { cascade(&indices[i].index); } dispatch_main(); return 0; }