void
irs_destroy(void) {
#ifndef DO_PTHREADS
	if (net_data != NULL)
		net_data_destroy(net_data);
	net_data = NULL;
#endif
}
Example #2
0
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);
}