1 /* $NetBSD: mt_misc.c,v 1.1.6.1 2001/08/08 16:13:44 nathanw Exp $ */ 2 3 /* 4 * Define and initialize MT data for libnsl. 5 * The _libnsl_lock_init() function below is the library's .init handler. 6 */ 7 8 /* #pragma ident "@(#)mt_misc.c 1.24 93/04/29 SMI" */ 9 10 #include "reentrant.h" 11 #include <rpc/rpc.h> 12 #include <sys/time.h> 13 #include <stdlib.h> 14 15 #ifdef _REENTRANT 16 17 /* protects the services list (svc.c) */ 18 rwlock_t svc_lock = RWLOCK_INITIALIZER; 19 /* protects svc_fdset and the xports[] array */ 20 rwlock_t svc_fd_lock = RWLOCK_INITIALIZER; 21 /* protects the RPCBIND address cache */ 22 rwlock_t rpcbaddr_cache_lock = RWLOCK_INITIALIZER; 23 24 /* protects authdes cache (svcauth_des.c) */ 25 mutex_t authdes_lock = MUTEX_INITIALIZER; 26 /* auth_none.c serialization */ 27 mutex_t authnone_lock = MUTEX_INITIALIZER; 28 /* protects the Auths list (svc_auth.c) */ 29 mutex_t authsvc_lock = MUTEX_INITIALIZER; 30 /* protects client-side fd lock array */ 31 mutex_t clnt_fd_lock = MUTEX_INITIALIZER; 32 /* clnt_raw.c serialization */ 33 mutex_t clntraw_lock = MUTEX_INITIALIZER; 34 /* domainname and domain_fd (getdname.c) and default_domain (rpcdname.c) */ 35 mutex_t dname_lock = MUTEX_INITIALIZER; 36 /* dupreq variables (svc_dg.c) */ 37 mutex_t dupreq_lock = MUTEX_INITIALIZER; 38 /* protects first_time and hostname (key_call.c) */ 39 mutex_t keyserv_lock = MUTEX_INITIALIZER; 40 /* serializes rpc_trace() (rpc_trace.c) */ 41 mutex_t libnsl_trace_lock = MUTEX_INITIALIZER; 42 /* loopnconf (rpcb_clnt.c) */ 43 mutex_t loopnconf_lock = MUTEX_INITIALIZER; 44 /* serializes ops initializations */ 45 mutex_t ops_lock = MUTEX_INITIALIZER; 46 /* protects ``port'' static in bindresvport() */ 47 mutex_t portnum_lock = MUTEX_INITIALIZER; 48 /* protects proglst list (svc_simple.c) */ 49 mutex_t proglst_lock = MUTEX_INITIALIZER; 50 /* serializes clnt_com_create() (rpc_soc.c) */ 51 mutex_t rpcsoc_lock = MUTEX_INITIALIZER; 52 /* svc_raw.c serialization */ 53 mutex_t svcraw_lock = MUTEX_INITIALIZER; 54 /* xprtlist (svc_generic.c) */ 55 mutex_t xprtlist_lock = MUTEX_INITIALIZER; 56 /* serializes calls to public key routines */ 57 mutex_t serialize_pkey = MUTEX_INITIALIZER; 58 59 #endif /* _REENTRANT */ 60 61 62 #undef rpc_createerr 63 64 struct rpc_createerr rpc_createerr; 65 66 #ifdef _REENTRANT 67 static thread_key_t rce_key; 68 static once_t rce_once = ONCE_INITIALIZER; 69 70 static void 71 __rpc_createerr_setup(void) 72 { 73 74 thr_keycreate(&rce_key, free); 75 } 76 #endif /* _REENTRANT */ 77 78 struct rpc_createerr* 79 __rpc_createerr() 80 { 81 #ifdef _REENTRANT 82 struct rpc_createerr *rce_addr = 0; 83 extern int __isthreaded; 84 85 if (__isthreaded == 0) 86 return (&rpc_createerr); 87 thr_once(&rce_once, __rpc_createerr_setup); 88 rce_addr = thr_getspecific(rce_key); 89 if (rce_addr == NULL) { 90 rce_addr = (struct rpc_createerr *) 91 malloc(sizeof (struct rpc_createerr)); 92 thr_setspecific(rce_key, (void *) rce_addr); 93 memset(rce_addr, 0, sizeof (struct rpc_createerr)); 94 } 95 96 return (rce_addr); 97 #else 98 return &rpc_createerr; 99 #endif 100 } 101 102