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