18360efbdSAlfred Perlstein /* $NetBSD: mt_misc.c,v 1.1 2000/06/02 23:11:11 fvdl Exp $ */ 28360efbdSAlfred Perlstein 38360efbdSAlfred Perlstein /* #pragma ident "@(#)mt_misc.c 1.24 93/04/29 SMI" */ 4d3d20c82SDavid E. O'Brien #include <sys/cdefs.h> 5d3d20c82SDavid E. O'Brien __FBSDID("$FreeBSD$"); 6d3d20c82SDavid E. O'Brien 78360efbdSAlfred Perlstein #include "namespace.h" 89f5afc13SIan Dowse #include "reentrant.h" 98360efbdSAlfred Perlstein #include <rpc/rpc.h> 108360efbdSAlfred Perlstein #include <sys/time.h> 118360efbdSAlfred Perlstein #include <stdlib.h> 12e0554a53SJacques Vidrine #include <string.h> 138360efbdSAlfred Perlstein #include "un-namespace.h" 14235baf26SDaniel Eischen #include "mt_misc.h" 15235baf26SDaniel Eischen 16235baf26SDaniel Eischen /* Take these objects out of the application namespace. */ 17235baf26SDaniel Eischen #define svc_lock __svc_lock 18235baf26SDaniel Eischen #define svc_fd_lock __svc_fd_lock 19235baf26SDaniel Eischen #define rpcbaddr_cache_lock __rpcbaddr_cache_lock 20235baf26SDaniel Eischen #define authdes_ops_lock __authdes_ops_lock 21235baf26SDaniel Eischen #define authnone_lock __authnone_lock 22235baf26SDaniel Eischen #define authsvc_lock __authsvc_lock 23235baf26SDaniel Eischen #define clnt_fd_lock __clnt_fd_lock 24235baf26SDaniel Eischen #define clntraw_lock __clntraw_lock 25235baf26SDaniel Eischen #define dupreq_lock __dupreq_lock 26235baf26SDaniel Eischen #define loopnconf_lock __loopnconf_lock 27235baf26SDaniel Eischen #define ops_lock __ops_lock 28235baf26SDaniel Eischen #define proglst_lock __proglst_lock 29235baf26SDaniel Eischen #define rpcsoc_lock __rpcsoc_lock 30235baf26SDaniel Eischen #define svcraw_lock __svcraw_lock 31235baf26SDaniel Eischen #define tsd_lock __tsd_lock 32235baf26SDaniel Eischen #define xprtlist_lock __xprtlist_lock 338360efbdSAlfred Perlstein 348360efbdSAlfred Perlstein /* protects the services list (svc.c) */ 358360efbdSAlfred Perlstein pthread_rwlock_t svc_lock = PTHREAD_RWLOCK_INITIALIZER; 368360efbdSAlfred Perlstein 378360efbdSAlfred Perlstein /* protects svc_fdset and the xports[] array */ 388360efbdSAlfred Perlstein pthread_rwlock_t svc_fd_lock = PTHREAD_RWLOCK_INITIALIZER; 398360efbdSAlfred Perlstein 408360efbdSAlfred Perlstein /* protects the RPCBIND address cache */ 418360efbdSAlfred Perlstein pthread_rwlock_t rpcbaddr_cache_lock = PTHREAD_RWLOCK_INITIALIZER; 428360efbdSAlfred Perlstein 438360efbdSAlfred Perlstein /* serializes authdes ops initializations */ 448360efbdSAlfred Perlstein pthread_mutex_t authdes_ops_lock = PTHREAD_MUTEX_INITIALIZER; 458360efbdSAlfred Perlstein 468360efbdSAlfred Perlstein /* protects des stats list */ 478360efbdSAlfred Perlstein pthread_mutex_t svcauthdesstats_lock = PTHREAD_MUTEX_INITIALIZER; 488360efbdSAlfred Perlstein 498360efbdSAlfred Perlstein /* auth_none.c serialization */ 508360efbdSAlfred Perlstein pthread_mutex_t authnone_lock = PTHREAD_MUTEX_INITIALIZER; 518360efbdSAlfred Perlstein 528360efbdSAlfred Perlstein /* protects the Auths list (svc_auth.c) */ 538360efbdSAlfred Perlstein pthread_mutex_t authsvc_lock = PTHREAD_MUTEX_INITIALIZER; 548360efbdSAlfred Perlstein 558360efbdSAlfred Perlstein /* protects client-side fd lock array */ 568360efbdSAlfred Perlstein pthread_mutex_t clnt_fd_lock = PTHREAD_MUTEX_INITIALIZER; 578360efbdSAlfred Perlstein 588360efbdSAlfred Perlstein /* clnt_raw.c serialization */ 598360efbdSAlfred Perlstein pthread_mutex_t clntraw_lock = PTHREAD_MUTEX_INITIALIZER; 608360efbdSAlfred Perlstein 618360efbdSAlfred Perlstein /* dupreq variables (svc_dg.c) */ 628360efbdSAlfred Perlstein pthread_mutex_t dupreq_lock = PTHREAD_MUTEX_INITIALIZER; 638360efbdSAlfred Perlstein 648360efbdSAlfred Perlstein /* loopnconf (rpcb_clnt.c) */ 658360efbdSAlfred Perlstein pthread_mutex_t loopnconf_lock = PTHREAD_MUTEX_INITIALIZER; 668360efbdSAlfred Perlstein 678360efbdSAlfred Perlstein /* serializes ops initializations */ 688360efbdSAlfred Perlstein pthread_mutex_t ops_lock = PTHREAD_MUTEX_INITIALIZER; 698360efbdSAlfred Perlstein 708360efbdSAlfred Perlstein /* protects proglst list (svc_simple.c) */ 718360efbdSAlfred Perlstein pthread_mutex_t proglst_lock = PTHREAD_MUTEX_INITIALIZER; 728360efbdSAlfred Perlstein 738360efbdSAlfred Perlstein /* serializes clnt_com_create() (rpc_soc.c) */ 748360efbdSAlfred Perlstein pthread_mutex_t rpcsoc_lock = PTHREAD_MUTEX_INITIALIZER; 758360efbdSAlfred Perlstein 768360efbdSAlfred Perlstein /* svc_raw.c serialization */ 778360efbdSAlfred Perlstein pthread_mutex_t svcraw_lock = PTHREAD_MUTEX_INITIALIZER; 788360efbdSAlfred Perlstein 798360efbdSAlfred Perlstein /* protects TSD key creation */ 808360efbdSAlfred Perlstein pthread_mutex_t tsd_lock = PTHREAD_MUTEX_INITIALIZER; 818360efbdSAlfred Perlstein 828360efbdSAlfred Perlstein /* xprtlist (svc_generic.c) */ 838360efbdSAlfred Perlstein pthread_mutex_t xprtlist_lock = PTHREAD_MUTEX_INITIALIZER; 848360efbdSAlfred Perlstein 858360efbdSAlfred Perlstein #undef rpc_createerr 868360efbdSAlfred Perlstein 878360efbdSAlfred Perlstein struct rpc_createerr rpc_createerr; 888360efbdSAlfred Perlstein 898360efbdSAlfred Perlstein struct rpc_createerr * 908360efbdSAlfred Perlstein __rpc_createerr() 918360efbdSAlfred Perlstein { 928360efbdSAlfred Perlstein static thread_key_t rce_key = 0; 938360efbdSAlfred Perlstein struct rpc_createerr *rce_addr = 0; 948360efbdSAlfred Perlstein 958360efbdSAlfred Perlstein if (thr_main()) 968360efbdSAlfred Perlstein return (&rpc_createerr); 978360efbdSAlfred Perlstein if ((rce_addr = 988360efbdSAlfred Perlstein (struct rpc_createerr *)thr_getspecific(rce_key)) != 0) { 998360efbdSAlfred Perlstein mutex_lock(&tsd_lock); 1008360efbdSAlfred Perlstein if (thr_keycreate(&rce_key, free) != 0) { 1018360efbdSAlfred Perlstein mutex_unlock(&tsd_lock); 1028360efbdSAlfred Perlstein return (&rpc_createerr); 1038360efbdSAlfred Perlstein } 1048360efbdSAlfred Perlstein mutex_unlock(&tsd_lock); 1058360efbdSAlfred Perlstein } 1068360efbdSAlfred Perlstein if (!rce_addr) { 1078360efbdSAlfred Perlstein rce_addr = (struct rpc_createerr *) 1088360efbdSAlfred Perlstein malloc(sizeof (struct rpc_createerr)); 1098360efbdSAlfred Perlstein if (thr_setspecific(rce_key, (void *) rce_addr) != 0) { 1108360efbdSAlfred Perlstein if (rce_addr) 1118360efbdSAlfred Perlstein free(rce_addr); 1128360efbdSAlfred Perlstein return (&rpc_createerr); 1138360efbdSAlfred Perlstein } 1148360efbdSAlfred Perlstein memset(rce_addr, 0, sizeof (struct rpc_createerr)); 1158360efbdSAlfred Perlstein return (rce_addr); 1168360efbdSAlfred Perlstein } 1178360efbdSAlfred Perlstein return (rce_addr); 1188360efbdSAlfred Perlstein } 119