xref: /netbsd-src/lib/libc/rpc/mt_misc.c (revision 5c945215d0dd49b384b81bf7b545b5128f553a9c)
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