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); }
const CFStringEncoding * CFStringGetListOfAvailableEncodings (void) { if (_kCFStringEncodingList == NULL) { GSMutexLock (&_kCFStringEncodingLock); if (_kCFStringEncodingList == NULL) { int32_t count; int32_t idx; const char *name; UErrorCode err = U_ZERO_ERROR; count = ucnv_countAvailable (); _kCFStringEncodingList = CFAllocatorAllocate (NULL, sizeof(CFStringEncoding) * (count + 1), 0); idx = 0; while (idx < count) { name = ucnv_getStandardName(ucnv_getAvailableName (idx), "MIME", &err); if (U_SUCCESS(err)) _kCFStringEncodingList[idx] = CFStringConvertStandardNameToEncoding (name, -1); ++idx; } _kCFStringEncodingList[idx] = kCFStringEncodingInvalidId; } GSMutexUnlock (&_kCFStringEncodingLock); } return _kCFStringEncodingList; }
CFStringEncoding CFStringGetSystemEncoding (void) { #if defined(_WIN32) return kCFStringEncodingASCII; #else if (_kCFStringSystemEncoding == kCFStringEncodingInvalidId) { GSMutexLock (&_kCFStringEncodingLock); if (_kCFStringSystemEncoding == kCFStringEncodingInvalidId) { const char *name; const char *defaultName; UErrorCode err = U_ZERO_ERROR; defaultName = ucnv_getDefaultName (); name = ucnv_getStandardName (defaultName, "MIME", &err); if (name != NULL) { _kCFStringSystemEncoding = CFStringConvertStandardNameToEncoding (name, -1); } else { name = ucnv_getStandardName (defaultName, "IANA", &err); if (name != NULL) _kCFStringSystemEncoding = CFStringConvertStandardNameToEncoding (name, -1); else _kCFStringSystemEncoding = kCFStringEncodingInvalidId; } } GSMutexUnlock (&_kCFStringEncodingLock); } return _kCFStringSystemEncoding; #endif }