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