mtctxres.c

来自「bind 源码 最新实现 linux/unix/windows平台」· C语言 代码 · 共 129 行

C
129
字号
#include <port_before.h>#ifdef DO_PTHREADS#include <pthread.h>#endif#include <errno.h>#include <netdb.h>#include <stdlib.h>#include <string.h>#include <resolv_mt.h>#include <irs.h>#include <port_after.h>#ifdef DO_PTHREADSstatic pthread_key_t	key;static int		mt_key_initialized = 0;static int		__res_init_ctx(void);static void		__res_destroy_ctx(void *);#if defined(sun) && !defined(__GNUC__)#pragma init	(_mtctxres_init)#endif#endifstatic mtctxres_t	sharedctx;#ifdef DO_PTHREADS/* * Initialize the TSD key. By doing this at library load time, we're * implicitly running without interference from other threads, so there's * no need for locking. */static void_mtctxres_init(void) {	int pthread_keycreate_ret;	pthread_keycreate_ret = pthread_key_create(&key, __res_destroy_ctx);	if (pthread_keycreate_ret == 0)		mt_key_initialized = 1;}#endif/* * To support binaries that used the private MT-safe interface in * Solaris 8, we still need to provide the __res_enable_mt() * and __res_disable_mt() entry points. They're do-nothing routines. */int__res_enable_mt(void) {	return (-1);}int__res_disable_mt(void) {	return (0);}#ifdef DO_PTHREADSstatic int__res_init_ctx(void) {	mtctxres_t	*mt;	int		ret;	if (pthread_getspecific(key) != 0) {		/* Already exists */		return (0);	}	if ((mt = malloc(sizeof (mtctxres_t))) == 0) {		errno = ENOMEM;		return (-1);	}	memset(mt, 0, sizeof (mtctxres_t));	if ((ret = pthread_setspecific(key, mt)) != 0) {		free(mt);		errno = ret;		return (-1);	}	return (0);}static void__res_destroy_ctx(void *value) {	mtctxres_t	*mt = (mtctxres_t *)value;	if (mt != 0)		free(mt);}#endifmtctxres_t *___mtctxres(void) {#ifdef DO_PTHREADS	mtctxres_t	*mt;	/*	 * This if clause should only be executed if we are linking	 * statically.  When linked dynamically _mtctxres_init() should	 * be called at binding time due the #pragma above.	 */	if (!mt_key_initialized) {		static pthread_mutex_t keylock = PTHREAD_MUTEX_INITIALIZER;                pthread_mutex_lock(&keylock);		_mtctxres_init();                pthread_mutex_unlock(&keylock);	}	/*	 * If we have already been called in this thread return the existing	 * context.  Otherwise recreat a new context and return it.  If	 * that fails return a global context.	 */	if (mt_key_initialized) {		if (((mt = pthread_getspecific(key)) != 0) ||		    (__res_init_ctx() == 0 &&		     (mt = pthread_getspecific(key)) != 0)) {			return (mt);		}	}#endif	return (&sharedctx);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?