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