void irs_destroy(void) { #ifndef DO_PTHREADS if (net_data != NULL) net_data_destroy(net_data); net_data = NULL; #endif }
struct net_data * net_data_init(const char *conf_file) { #ifdef DO_PTHREADS #ifndef LIBBIND_MUTEX_INITIALIZER #define LIBBIND_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER #endif static pthread_mutex_t keylock = LIBBIND_MUTEX_INITIALIZER; struct net_data *net_data; if (!once) { if (pthread_mutex_lock(&keylock) != 0) return (NULL); if (!once) { if (pthread_key_create(&key, net_data_destroy) != 0) { (void)pthread_mutex_unlock(&keylock); return (NULL); } once = 1; } if (pthread_mutex_unlock(&keylock) != 0) return (NULL); } net_data = pthread_getspecific(key); #endif if (net_data == NULL) { net_data = net_data_create(conf_file); if (net_data == NULL) return (NULL); #ifdef DO_PTHREADS if (pthread_setspecific(key, net_data) != 0) { net_data_destroy(net_data); return (NULL); } #endif } return (net_data); }