mt_misc.c revision 92990
1/* $NetBSD: mt_misc.c,v 1.1 2000/06/02 23:11:11 fvdl Exp $ */ 2 3/* #pragma ident "@(#)mt_misc.c 1.24 93/04/29 SMI" */ 4 5#include <sys/cdefs.h> 6__FBSDID("$FreeBSD: head/lib/libc/rpc/mt_misc.c 92990 2002-03-22 23:18:37Z obrien $"); 7 8#include "namespace.h" 9#include "reentrant.h" 10#include <rpc/rpc.h> 11#include <sys/time.h> 12#include <stdlib.h> 13#include "un-namespace.h" 14 15/* protects the services list (svc.c) */ 16pthread_rwlock_t svc_lock = PTHREAD_RWLOCK_INITIALIZER; 17 18/* protects svc_fdset and the xports[] array */ 19pthread_rwlock_t svc_fd_lock = PTHREAD_RWLOCK_INITIALIZER; 20 21/* protects the RPCBIND address cache */ 22pthread_rwlock_t rpcbaddr_cache_lock = PTHREAD_RWLOCK_INITIALIZER; 23 24/* protects authdes cache (svcauth_des.c) */ 25pthread_mutex_t authdes_lock = PTHREAD_MUTEX_INITIALIZER; 26 27/* serializes authdes ops initializations */ 28pthread_mutex_t authdes_ops_lock = PTHREAD_MUTEX_INITIALIZER; 29 30/* protects des stats list */ 31pthread_mutex_t svcauthdesstats_lock = PTHREAD_MUTEX_INITIALIZER; 32 33#ifdef KERBEROS 34/* auth_kerb.c serialization */ 35pthread_mutex_t authkerb_lock = PTHREAD_MUTEX_INITIALIZER; 36/* protects kerb stats list */ 37pthread_mutex_t svcauthkerbstats_lock = PTHREAD_MUTEX_INITIALIZER; 38#endif /* KERBEROS */ 39 40/* auth_none.c serialization */ 41pthread_mutex_t authnone_lock = PTHREAD_MUTEX_INITIALIZER; 42 43/* protects the Auths list (svc_auth.c) */ 44pthread_mutex_t authsvc_lock = PTHREAD_MUTEX_INITIALIZER; 45 46/* protects client-side fd lock array */ 47pthread_mutex_t clnt_fd_lock = PTHREAD_MUTEX_INITIALIZER; 48 49/* clnt_raw.c serialization */ 50pthread_mutex_t clntraw_lock = PTHREAD_MUTEX_INITIALIZER; 51 52/* domainname and domain_fd (getdname.c) and default_domain (rpcdname.c) */ 53pthread_mutex_t dname_lock = PTHREAD_MUTEX_INITIALIZER; 54 55/* dupreq variables (svc_dg.c) */ 56pthread_mutex_t dupreq_lock = PTHREAD_MUTEX_INITIALIZER; 57 58/* protects first_time and hostname (key_call.c) */ 59pthread_mutex_t keyserv_lock = PTHREAD_MUTEX_INITIALIZER; 60 61/* serializes rpc_trace() (rpc_trace.c) */ 62pthread_mutex_t libnsl_trace_lock = PTHREAD_MUTEX_INITIALIZER; 63 64/* loopnconf (rpcb_clnt.c) */ 65pthread_mutex_t loopnconf_lock = PTHREAD_MUTEX_INITIALIZER; 66 67/* serializes ops initializations */ 68pthread_mutex_t ops_lock = PTHREAD_MUTEX_INITIALIZER; 69 70/* protects ``port'' static in bindresvport() */ 71pthread_mutex_t portnum_lock = PTHREAD_MUTEX_INITIALIZER; 72 73/* protects proglst list (svc_simple.c) */ 74pthread_mutex_t proglst_lock = PTHREAD_MUTEX_INITIALIZER; 75 76/* serializes clnt_com_create() (rpc_soc.c) */ 77pthread_mutex_t rpcsoc_lock = PTHREAD_MUTEX_INITIALIZER; 78 79/* svc_raw.c serialization */ 80pthread_mutex_t svcraw_lock = PTHREAD_MUTEX_INITIALIZER; 81 82/* protects TSD key creation */ 83pthread_mutex_t tsd_lock = PTHREAD_MUTEX_INITIALIZER; 84 85/* xprtlist (svc_generic.c) */ 86pthread_mutex_t xprtlist_lock = PTHREAD_MUTEX_INITIALIZER; 87 88/* serializes calls to public key routines */ 89pthread_mutex_t serialize_pkey = PTHREAD_MUTEX_INITIALIZER; 90 91#undef rpc_createerr 92 93struct rpc_createerr rpc_createerr; 94 95struct rpc_createerr * 96__rpc_createerr() 97{ 98 static thread_key_t rce_key = 0; 99 struct rpc_createerr *rce_addr = 0; 100 101 if (thr_main()) 102 return (&rpc_createerr); 103 if ((rce_addr = 104 (struct rpc_createerr *)thr_getspecific(rce_key)) != 0) { 105 mutex_lock(&tsd_lock); 106 if (thr_keycreate(&rce_key, free) != 0) { 107 mutex_unlock(&tsd_lock); 108 return (&rpc_createerr); 109 } 110 mutex_unlock(&tsd_lock); 111 } 112 if (!rce_addr) { 113 rce_addr = (struct rpc_createerr *) 114 malloc(sizeof (struct rpc_createerr)); 115 if (thr_setspecific(rce_key, (void *) rce_addr) != 0) { 116 if (rce_addr) 117 free(rce_addr); 118 return (&rpc_createerr); 119 } 120 memset(rce_addr, 0, sizeof (struct rpc_createerr)); 121 return (rce_addr); 122 } 123 return (rce_addr); 124} 125