From 327762071be3806c5d08be0218982c7027754756 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Tue, 5 Jul 2011 09:20:15 +0100 Subject: [PATCH] rx/rxkad: Move rxkad initialisation into rxkad When the RX pthread conversion was done, the initialisation of rxkad mutexes was incorporated into the rx library itself. This is a layering violation (it breaks the relatively clean security object abstraction), and means that you can't actually use RX without the rxkad library. So, remove all of this initialisation from RX. As security libraries don't have an explicit initialisation function, we setup our various mutexes using a pthread_once function called from the NewSecurityObject functions. This has the added bonus that it removes the final error in rx.c for pthread builds, and so another bit of warning suppression can be removed. Change-Id: I3cf9b2404a03fb58534c5f41afd77aa5ba5e2256 Reviewed-on: http://gerrit.openafs.org/5361 Reviewed-by: Derrick Brashear Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- README.WARNINGS | 1 - src/libafsrpc/Makefile.in | 1 - src/rx/rx.c | 6 ------ src/rxkad/rxkad_client.c | 7 ++++--- src/rxkad/rxkad_common.c | 38 ++++++++++++++++++++++++++++++------ src/rxkad/rxkad_prototypes.h | 4 ++-- src/rxkad/rxkad_server.c | 2 ++ src/rxkad/stats.h | 1 - src/shlibafsrpc/Makefile.in | 1 - 9 files changed, 40 insertions(+), 21 deletions(-) diff --git a/README.WARNINGS b/README.WARNINGS index 9c439aa92..2861fb4a6 100644 --- a/README.WARNINGS +++ b/README.WARNINGS @@ -57,7 +57,6 @@ libadmin/kas/afs_kasAdmin.c: all : Ubik_Call nonsense libadmin/samples/rxstat_query_peer.c : all : util_RPCStatsStateGet types libadmin/samples/rxstat_query_process.c : all : util_RPCStatsStateGet types libadmin/test/client.c : all : util_RPCStatsStateGet types -rx/rx.c : all (pthread) : rxkad_global_stats_init not proto'd rxkad/ticket5.c : all : v5gen.c has set-but-unused variables ubik/ubikclient.c : strict-protos : ubik_Call volser/vol-dump.c : format : afs_sfsize_t diff --git a/src/libafsrpc/Makefile.in b/src/libafsrpc/Makefile.in index bb09400c9..3b49d0229 100644 --- a/src/libafsrpc/Makefile.in +++ b/src/libafsrpc/Makefile.in @@ -134,7 +134,6 @@ rx_user.o: ${RX}/rx_user.c rx_pthread.o: ${RX}/rx_pthread.c $(AFS_CCRULE) $(RX)/rx_pthread.c -CFLAGS_rx.o = @CFLAGS_NOERROR@ rx.o: ${RX}/rx.c $(AFS_CCRULE) $(RX)/rx.c diff --git a/src/rx/rx.c b/src/rx/rx.c index 0216480b7..1ddc09ed7 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -193,8 +193,6 @@ extern afs_kmutex_t event_handler_mutex; extern afs_kmutex_t listener_mutex; extern afs_kmutex_t rx_if_init_mutex; extern afs_kmutex_t rx_if_mutex; -extern afs_kmutex_t rxkad_client_uid_mutex; -extern afs_kmutex_t rxkad_random_mutex; extern afs_kcondvar_t rx_event_handler_cond; extern afs_kcondvar_t rx_listener_cond; @@ -222,8 +220,6 @@ rxi_InitPthread(void) MUTEX_INIT(&listener_mutex, "listener", MUTEX_DEFAULT, 0); MUTEX_INIT(&rx_if_init_mutex, "if init", MUTEX_DEFAULT, 0); MUTEX_INIT(&rx_if_mutex, "if", MUTEX_DEFAULT, 0); - MUTEX_INIT(&rxkad_client_uid_mutex, "uid", MUTEX_DEFAULT, 0); - MUTEX_INIT(&rxkad_random_mutex, "rxkad random", MUTEX_DEFAULT, 0); MUTEX_INIT(&rx_debug_mutex, "debug", MUTEX_DEFAULT, 0); CV_INIT(&rx_event_handler_cond, "evhand", CV_DEFAULT, 0); @@ -232,8 +228,6 @@ rxi_InitPthread(void) osi_Assert(pthread_key_create(&rx_thread_id_key, NULL) == 0); osi_Assert(pthread_key_create(&rx_ts_info_key, NULL) == 0); - rxkad_global_stats_init(); - MUTEX_INIT(&rx_rpc_stats, "rx_rpc_stats", MUTEX_DEFAULT, 0); MUTEX_INIT(&rx_freePktQ_lock, "rx_freePktQ_lock", MUTEX_DEFAULT, 0); #ifdef RX_ENABLE_LOCKS diff --git a/src/rxkad/rxkad_client.c b/src/rxkad/rxkad_client.c index 1e36c160b..f8522d1f9 100644 --- a/src/rxkad/rxkad_client.c +++ b/src/rxkad/rxkad_client.c @@ -33,14 +33,13 @@ #endif /* !UKERNEL */ #else /* ! KERNEL */ #include -#ifdef AFS_PTHREAD_ENV -#include "rx/rxkad.h" -#endif /* AFS_PTHREAD_ENV */ #endif /* KERNEL */ + #include #include +#include "rxkad.h" #include "stats.h" #include "private_data.h" #define XPRT_RXKAD_CLIENT @@ -157,6 +156,8 @@ rxkad_NewClientSecurityObject(rxkad_level level, int code; int size, psize; + rxkad_Init(); + size = sizeof(struct rx_securityClass); tsc = rxi_Alloc(size); memset((void *)tsc, 0, size); diff --git a/src/rxkad/rxkad_common.c b/src/rxkad/rxkad_common.c index e4b01d376..8eed980a4 100644 --- a/src/rxkad/rxkad_common.c +++ b/src/rxkad/rxkad_common.c @@ -67,6 +67,32 @@ struct rxkad_stats rxkad_stats = { { 0 } }; #endif /* AFS_PTHREAD_ENV */ #ifdef AFS_PTHREAD_ENV +/* Pthread initialisation */ +static pthread_once_t rxkad_once_init = PTHREAD_ONCE_INIT; +extern pthread_mutex_t rxkad_client_uid_mutex; +extern pthread_mutex_t rxkad_random_mutex; + +static void +rxkad_global_stats_init(void) +{ + osi_Assert(pthread_mutex_init(&rxkad_global_stats_lock, (const pthread_mutexattr_t *)0) == 0); + osi_Assert(pthread_key_create(&rxkad_stats_key, NULL) == 0); + memset(&rxkad_global_stats, 0, sizeof(rxkad_global_stats)); +} + +static void +rxkad_InitPthread(void) { + MUTEX_INIT(&rxkad_client_uid_mutex, "uid", MUTEX_DEFAULT, 0); + MUTEX_INIT(&rxkad_random_mutex, "rxkad random", MUTEX_DEFAULT, 0); + + rxkad_global_stats_init(); +} + +void +rxkad_Init(void) { + osi_Assert(pthread_once(&rxkad_once_init, rxkad_InitPthread) == 0); +} + /* rxkad_stats related stuff */ /* @@ -84,12 +110,6 @@ struct rxkad_stats rxkad_stats = { { 0 } }; osi_Assert((head) && ((head)->prev == NULL)); \ } while(0) -void rxkad_global_stats_init(void) { - osi_Assert(pthread_mutex_init(&rxkad_global_stats_lock, (const pthread_mutexattr_t *)0) == 0); - osi_Assert(pthread_key_create(&rxkad_stats_key, NULL) == 0); - memset(&rxkad_global_stats, 0, sizeof(rxkad_global_stats)); -} - rxkad_stats_t * rxkad_thr_stats_init(void) { rxkad_stats_t * rxkad_stats; @@ -163,6 +183,12 @@ int rxkad_stats_agg(rxkad_stats_t * rxkad_stats) { RXKAD_GLOBAL_STATS_UNLOCK; return 0; } +#else +void +rxkad_Init(void) +{ + return; +} #endif /* AFS_PTHREAD_ENV */ /* static prototypes */ diff --git a/src/rxkad/rxkad_prototypes.h b/src/rxkad/rxkad_prototypes.h index 71da356ee..be0360867 100644 --- a/src/rxkad/rxkad_prototypes.h +++ b/src/rxkad/rxkad_prototypes.h @@ -52,6 +52,8 @@ extern int rxkad_GetResponse(struct rx_securityClass *aobj, extern void rxkad_ResetState(void); /* rxkad_common.c */ +extern void rxkad_Init(void); + struct rxkad_endpoint; extern int rxkad_SetupEndpoint(struct rx_connection *aconnp, struct rxkad_endpoint *aendpointp); @@ -80,8 +82,6 @@ extern int rxkad_GetStats(struct rx_securityClass *aobj, extern rxkad_level rxkad_StringToLevel(char *string); extern char *rxkad_LevelToString(rxkad_level level); -extern void rxkad_global_stats_init(void); - /* rxkad_errs.c */ /* rxkad_server.c */ diff --git a/src/rxkad/rxkad_server.c b/src/rxkad/rxkad_server.c index 0b2745a88..82b1c9696 100644 --- a/src/rxkad/rxkad_server.c +++ b/src/rxkad/rxkad_server.c @@ -137,6 +137,8 @@ rxkad_NewServerSecurityObject(rxkad_level level, void *get_key_rock, struct rxkad_sprivate *tsp; int size; + rxkad_Init(); + if (!get_key) return 0; diff --git a/src/rxkad/stats.h b/src/rxkad/stats.h index 3df9c3e7e..34ff09f14 100644 --- a/src/rxkad/stats.h +++ b/src/rxkad/stats.h @@ -69,7 +69,6 @@ struct rxkad_global_stats { extern pthread_mutex_t rxkad_global_stats_lock; extern pthread_key_t rxkad_stats_key; -extern void rxkad_global_stats_init(void); extern rxkad_stats_t * rxkad_thr_stats_init(void); extern int rxkad_stats_agg(rxkad_stats_t *); diff --git a/src/shlibafsrpc/Makefile.in b/src/shlibafsrpc/Makefile.in index 9c5cfd0b0..29b9226cf 100644 --- a/src/shlibafsrpc/Makefile.in +++ b/src/shlibafsrpc/Makefile.in @@ -155,7 +155,6 @@ rx_user.o: ${RX}/rx_user.c rx_pthread.o: ${RX}/rx_pthread.c $(AFS_CCRULE) $(RX)/rx_pthread.c -CFLAGS_rx.o = @CFLAGS_NOERROR@ rx.o: ${RX}/rx.c $(AFS_CCRULE) $(RX)/rx.c -- 2.39.5