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; }
static void CFSocketFinalize (CFTypeRef cf) { CFSocketRef s = (CFSocketRef)cf; #if HAVE_LIBDISPATCH dispatch_queue_t q = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_cancel(s->_readSource); dispatch_source_cancel(s->_writeSource); // Wait for source handlers to complete // before we proceed to destruction. dispatch_barrier_sync_f(q, NULL, DummyBarrier); if (s->_source != NULL) CFRelease(s->_source); #endif if (s->_socket != -1) { GSMutexLock (&_kCFSocketObjectsLock); CFDictionaryRemoveValue(_kCFSocketObjects, (void*)(uintptr_t) s->_socket); closesocket (s->_socket); GSMutexUnlock (&_kCFSocketObjectsLock); } if (s->_address) CFRelease (s->_address); if (s->_peerAddress) CFRelease (s->_peerAddress); }