static VALUE rb_source_init(VALUE self, SEL sel, VALUE type, VALUE handle, VALUE mask, VALUE queue) { Check_Queue(queue); rb_source_t *src = RSource(self); src->source_enum = (source_enum_t) NUM2LONG(type); dispatch_source_type_t c_type = rb_source_enum2type(src->source_enum); assert(c_type != NULL); uintptr_t c_handle = NUM2UINT(rb_Integer(handle)); unsigned long c_mask = NUM2LONG(mask); dispatch_queue_t c_queue = RQueue(queue)->queue; src->source = dispatch_source_create(c_type, c_handle, c_mask, c_queue); assert(src->source != NULL); rb_vm_block_t *block = get_prepared_block(); GC_WB(&src->event_handler, block); GC_RETAIN(self); // apparently needed to ensure consistent counting dispatch_set_context(src->source, (void *)self); dispatch_source_set_event_handler_f(src->source, rb_source_event_handler); GC_WB(&src->handle, handle); if (rb_source_is_file(src) && rb_obj_is_kind_of(handle, rb_cIO)) { dispatch_source_set_cancel_handler_f(src->source, rb_source_close_handler); } rb_dispatch_resume(self, 0); return self; }
static VALUE rb_queue_dispatch_barrier_sync(VALUE self, SEL sel) { rb_vm_block_t *block = get_prepared_block(); dispatch_barrier_sync_f(RQueue(self)->queue, (void *)block, rb_block_dispatcher); return Qnil; }
/* * call-seq: * gcdq.after(delay) { block } * * Runs the passed block after the given delay (in seconds) using * dispatch_after(3)[http://developer.apple.com/mac/library/DOCUMENTATION/Darwin/Reference/ManPages/man3/dispatch_after.3.html], * * gcdq.after(0.5) { puts 'wait is over :)' } * */ static VALUE rb_queue_dispatch_after(VALUE self, SEL sel, VALUE delay) { dispatch_time_t offset = NIL_P(delay) ? DISPATCH_TIME_NOW : rb_num2timeout(delay); rb_vm_block_t *block = get_prepared_block(); dispatch_after_f(offset, RQueue(self)->queue, (void *)block, rb_block_dispatcher); return Qnil; }
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; }
static VALUE rb_queue_apply(VALUE self, SEL sel, VALUE n) { rb_vm_block_t *block = get_prepared_block(); dispatch_apply_f(NUM2SIZET(n), RQueue(self)->queue, (void *)block, rb_block_applier); GC_RELEASE(block); return Qnil; }
static VALUE rb_queue_dispatch_async(VALUE self, SEL sel, int argc, VALUE *argv) { rb_vm_block_t *block = get_prepared_block(); VALUE group; rb_scan_args(argc, argv, "01", &group); if (group != Qnil) { Check_Group(group); dispatch_group_async_f(RGroup(group)->group, RQueue(self)->queue, (void *)block, rb_block_dispatcher); } else { dispatch_async_f(RQueue(self)->queue, (void *)block, rb_block_dispatcher); } return Qnil; }