void dispatch_group_notify(dispatch_group_t dg, dispatch_queue_t dq, dispatch_block_t db) { dispatch_group_notify_f(dg, dq, _dispatch_Block_copy(db), _dispatch_call_block_and_release); }
static void do_test(void) { size_t i; char buf[1000]; dispatch_group_t g = dispatch_group_create(); for (i = 0; i < QUEUES; i++) { #ifdef WIN32 _snprintf(buf, sizeof(buf), "com.example.memoryload-node#%ld", i); #else snprintf(buf, sizeof(buf), "com.example.memoryload-node#%ld", (long int)i); #endif queues[i] = dispatch_queue_create(buf, NULL); dispatch_suspend(queues[i]); } for (i = 0; i < QUEUES; i++) { dispatch_group_async_f(g, queues[i], g, start_node); } dispatch_group_notify_f(g, dispatch_get_main_queue(), NULL, collect); for (i = 0; i < QUEUES; i++) { dispatch_resume(queues[i]); dispatch_release(queues[i]); } }
void group::notify( operation *r, const queue &q ) { dispatch_queue_t nat_q = (dispatch_queue_t)q.native(); XDISPATCH_ASSERT( nat_q ); dispatch_group_notify_f( m_native, nat_q, r, _xdispatch_run_operation ); }
static VALUE rb_group_notify(VALUE self, SEL sel, VALUE target) { rb_vm_block_t *block = get_prepared_block(); Check_Queue(target); dispatch_group_notify_f(RGroup(self)->group, RQueue(target)->queue, (void *)block, rb_block_dispatcher); return Qnil; }
void dispatch_group_function() { long res; dispatch_group_t group; MU_BEGIN_TEST(dispatch_group_function); group = create_group(100, 0); MU_ASSERT_NOT_NULL(group); dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // should be OK to re-use a group dispatch_group_async_f(group, dispatch_get_global_queue(0, 0), 0, foo); dispatch_group_wait(group, DISPATCH_TIME_FOREVER); dispatch_release(group); group = NULL; group = create_group(3, 7); MU_ASSERT_NOT_NULL(group); res = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC)); MU_ASSERT_EQUAL(!res, 0); // retry after timeout (this time succeed) res = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC)); MU_ASSERT_EQUAL(res, 0); dispatch_release(group); group = NULL; group = create_group(100, 0); MU_ASSERT_NOT_NULL(group); dispatch_group_notify_f(group, dispatch_get_main_queue(), 0, group_notify); dispatch_release(group); group = NULL; dispatch_main(); MU_FAIL("Should never reach this"); MU_END_TEST }